ποίο από τα τρία είναι το πιο γρήγορο για να δημιουρήσω ένα απλό token;

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
sibas
Honorary Member
Δημοσιεύσεις: 1851
Εγγραφή: 21 Φεβ 2003 01:21
Τοποθεσία: Μια εδώ.. Μια εκεί.. Σήμερα είμαι εδώ!!!
Επικοινωνία:

ποίο από τα τρία είναι το πιο γρήγορο για να δημιουρήσω ένα απλό token;

Δημοσίευση από sibas » 16 Ιούλ 2016 10:28

θέλω να δημιουρήσω ένα απλό token
ποίο από τα παρακάτω είναι το πιο γρήγορο, χρειάζεται λιγότερη μνήμη για να εκτελεστεί, και λιγότερους cpu κύκλους?

Κώδικας: Επιλογή όλων

  
$token = md5(uniqid(microtime(), true));
$token = uniqid(microtime(true), true);
$token = md5(session_id());
έχει κανείς κάμια ιδέα?

sibas
Honorary Member
Δημοσιεύσεις: 1851
Εγγραφή: 21 Φεβ 2003 01:21
Τοποθεσία: Μια εδώ.. Μια εκεί.. Σήμερα είμαι εδώ!!!
Επικοινωνία:

ποίο από τα τρία είναι το πιο γρήγορο για να δημιουρήσω ένα απλό token;

Δημοσίευση από sibas » 16 Ιούλ 2016 14:22

Δεν μπόρεσα να βρώ κάποια άκρη, έψαξα τριγύρω, και έτσι έφτιαξα κάποια δικά μου benchmark
(dunno ότι είναι ρεαλιστικά!)

benchmark script

Κώδικας: Επιλογή όλων

<?php 
session_start&#40;&#41;;
session_regenerate_id&#40;&#41;;

function countMemory&#40;$size&#41;&#123;
    $unit=array&#40;'b','kb','mb','gb'&#41;;
    return @round&#40;$size/pow&#40;1024,&#40;$i=floor&#40;log&#40;$size,1024&#41;&#41;&#41;&#41;,2&#41;.' '.$unit&#91;$i&#93;;
&#125;

function Token1&#40;&#41; &#123;
   return md5&#40;uniqid&#40;microtime&#40;&#41;, true&#41;&#41;;
&#125;

function Token2&#40;&#41; &#123;
   return uniqid&#40;microtime&#40;true&#41;, true&#41;;
&#125;

function Token3&#40;&#41; &#123;
   return md5&#40;session_id&#40;&#41;&#41;;
&#125;


define&#40;'EXECUTE_TIMES', 1000&#41;;
echo 'Execute times = '.EXECUTE_TIMES.' &#91;Memory&#58; '.countMemory&#40;memory_get_usage&#40;&#41;&#41;.'&#93;<br>';

# test 1
$start = microtime&#40;true&#41;;
sleep&#40;1&#41;;
	for&#40; $i = 0; $i < EXECUTE_TIMES; $i++&#41;&#123;
	  //  md5&#40;uniqid&#40;microtime&#40;&#41;, true&#41;&#41;;
	    Token1&#40;&#41;;
	    $memory = countMemory&#40;memory_get_usage&#40;&#41;&#41;;
	    
	&#125;
$end = microtime&#40;true&#41; - $start;
echo 'md5&#40;uniqid&#40;microtime&#40;&#41;, true&#41;&#41;&#58; '.$end.' - Memory&#58; '.$memory.'<br>';

# test 2
$start = microtime&#40; true&#41;;
sleep&#40;1&#41;;
	for&#40; $i = 0; $i < EXECUTE_TIMES; $i++&#41;&#123;
	    //uniqid&#40;microtime&#40;true&#41;, true&#41;;
	    Token2&#40;&#41;;
	    $memory = countMemory&#40;memory_get_usage&#40;&#41;&#41;;
	&#125;
$end = microtime&#40;true&#41; - $start;
echo 'uniqid&#40;microtime&#40;true&#41;, true&#41;&#58; '.$end.' - Memory&#58; '.$memory.'<br>';

# test 3
$start = microtime&#40;true&#41;;
sleep&#40;1&#41;;
	for&#40; $i = 0; $i < EXECUTE_TIMES; ++$i&#41;&#123;
	   // md5&#40;session_id&#40;&#41;&#41;;
	    Token3&#40;&#41;;
	    $memory = countMemory&#40;memory_get_usage&#40;&#41;&#41;;

	&#125;
$end = microtime&#40;true&#41; - $start;
echo 'md5&#40;session_id&#40;&#41;&#41;&#58; '.$end.' - Memory&#58; '.$memory.'<br>';
?>

τα αποτελέσματα στο δικό μου pc είναι τα παρακάτω

1000
Execute times = 1000 [Memory: 128.61 kb]
md5(uniqid(microtime(), true)): 1.0297720432281 - Memory: 129.22 kb
uniqid(microtime(true), true): 1.0305609703064 - Memory: 129.31 kb
md5(session_id()): 1.0201737880707 - Memory: 129.33 kb

10
Execute times = 10 [Memory: 128.61 kb]
md5(uniqid(microtime(), true)): 1.0126550197601 - Memory: 129.22 kb
uniqid(microtime(true), true): 1.0155811309814 - Memory: 129.31 kb
md5(session_id()): 1.0158469676971 - Memory: 129.33 kb
1
Execute times = 1 [Memory: 128.61 kb]
md5(uniqid(microtime(), true)): 1.0061728954315 - Memory: 129.11 kb
uniqid(microtime(true), true): 1.0002188682556 - Memory: 129.31 kb
md5(session_id()): 1.0156729221344 - Memory: 129.33 kb

Στην μια εκτέλεση winner είναι το uniqid(microtime(true), true)
αλλά στο σύνολο νομίζω ότι είναι προτιμότερο το md5(session_id())
δεν νομίζω ότι τίθεται θέμα μνήμης

εσείς τι λέτε?

Άβαταρ μέλους
cordis
Administrator, [F|H]ounder, [C|S]EO
Δημοσιεύσεις: 27616
Εγγραφή: 09 Οκτ 1999 03:00
Τοποθεσία: Greece
Επικοινωνία:

ποίο από τα τρία είναι το πιο γρήγορο για να δημιουρήσω ένα απλό token;

Δημοσίευση από cordis » 16 Ιούλ 2016 14:25

δοκίμασε τες με το getrusage και θα σου πει η PHP πιο κάνει πιο γρήγορα. ;)
http://php.net/getrusage
Δεν απαντάω σε προσωπικά μηνύματα με ερωτήσεις που καλύπτονται από τις ενότητες του forum. Για ο,τι άλλο είμαι εδώ για εσάς.
- follow me @twitter

sibas
Honorary Member
Δημοσιεύσεις: 1851
Εγγραφή: 21 Φεβ 2003 01:21
Τοποθεσία: Μια εδώ.. Μια εκεί.. Σήμερα είμαι εδώ!!!
Επικοινωνία:

ποίο από τα τρία είναι το πιο γρήγορο για να δημιουρήσω ένα απλό token;

Δημοσίευση από sibas » 16 Ιούλ 2016 14:29

έκανα και λάθος, στα πρώτα 2 loop αλλάξτε το $i++ σε ++$i

sibas
Honorary Member
Δημοσιεύσεις: 1851
Εγγραφή: 21 Φεβ 2003 01:21
Τοποθεσία: Μια εδώ.. Μια εκεί.. Σήμερα είμαι εδώ!!!
Επικοινωνία:

ποίο από τα τρία είναι το πιο γρήγορο για να δημιουρήσω ένα απλό token;

Δημοσίευση από sibas » 16 Ιούλ 2016 14:32

ενδιαφέρον το getrusage θα το δοκιμάσω!!!

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

ποίο από τα τρία είναι το πιο γρήγορο για να δημιουρήσω ένα απλό token;

Δημοσίευση από gvre » 18 Ιούλ 2016 15:43

sibas έγραψε:θέλω να δημιουρήσω ένα απλό token
ποίο από τα παρακάτω είναι το πιο γρήγορο, χρειάζεται λιγότερη μνήμη για να εκτελεστεί, και λιγότερους cpu κύκλους?

Κώδικας: Επιλογή όλων

  
$token = md5&#40;uniqid&#40;microtime&#40;&#41;, true&#41;&#41;;
$token = uniqid&#40;microtime&#40;true&#41;, true&#41;;
$token = md5&#40;session_id&#40;&#41;&#41;;
έχει κανείς κάμια ιδέα?
1. Σκοπεύεις να δημιουργείς καμιά 10αριά εκατομμύρια tokens / ημέρα και σε ενδιαφέρει τόσο πολύ η ταχύτητα;
2. Πού θα χρησιμοποιείς το token;

Άβαταρ μέλους
Rapid-eraser
WebDev Moderator
Δημοσιεύσεις: 6851
Εγγραφή: 05 Απρ 2003 17:50
Τοποθεσία: Πειραιάς
Επικοινωνία:

ποίο από τα τρία είναι το πιο γρήγορο για να δημιουρήσω ένα απλό token;

Δημοσίευση από Rapid-eraser » 18 Ιούλ 2016 17:39

το md5 και sha1 κάνουν πολύ εύκολα collisions

To session_id() για όλη την διάρκεια του script θα φέρνει το ίδιο session id

Για σωστό seeding καλύτερα να χρησιμοποιήσεις :
random_int(), random_bytes(), openssl_random_pseudo_bytes()

Τώρα για το performance δεν χρειάζεται να ανησυχείς ... θα είναι το τελευταίο σημείο το οποίο θα χρειαστεί να τσεκάρεις για bottleneck στο script.
Cu, Rapid-eraser, Tα αγαθά copies κτώνται.
Love is like oxygen, You get too much you get too high
Not enough and you're gonna die, Love gets you high

sibas
Honorary Member
Δημοσιεύσεις: 1851
Εγγραφή: 21 Φεβ 2003 01:21
Τοποθεσία: Μια εδώ.. Μια εκεί.. Σήμερα είμαι εδώ!!!
Επικοινωνία:

ποίο από τα τρία είναι το πιο γρήγορο για να δημιουρήσω ένα απλό token;

Δημοσίευση από sibas » 19 Ιούλ 2016 08:44

Είναι token για την δημιουργία csrf σε κάθε form τα οποία αλλάζουν με κάθε reload, για αυτό το λόγο δεν με ενδιαφέρει το θέμα του seeding.
Μια σελίδα μπορεί να έχει μέχρι και 5 διαφορετικά, αλλά υπάρχουν και μερικές σελίδες όπου μπορεί να ξεπεράσουν και τα 500/1000 ανάλογα με τις εγγραφές στην db, εξού και η αρχική μου απορία για το ποιο είναι πιο γρήγορο!

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

ποίο από τα τρία είναι το πιο γρήγορο για να δημιουρήσω ένα απλό token;

Δημοσίευση από gvre » 19 Ιούλ 2016 15:04

Χρησιμοποίησε την random_bytes, όπως σου πρότεινε και ο Rapid-eraser. Υπάρχει και userland implementation για php < 7.

Άβαταρ μέλους
Rapid-eraser
WebDev Moderator
Δημοσιεύσεις: 6851
Εγγραφή: 05 Απρ 2003 17:50
Τοποθεσία: Πειραιάς
Επικοινωνία:

ποίο από τα τρία είναι το πιο γρήγορο για να δημιουρήσω ένα απλό token;

Δημοσίευση από Rapid-eraser » 19 Ιούλ 2016 17:09

sibas κάνε χρήση τότε κάποιου queue τύπου Beanstalk ή zeromq
και κάνε με workers όλο το processing αφαιρώντας αυτή την αναμονή από το presentation σε δεύτερο χρόνο.
Cu, Rapid-eraser, Tα αγαθά copies κτώνται.
Love is like oxygen, You get too much you get too high
Not enough and you're gonna die, Love gets you high

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

ποίο από τα τρία είναι το πιο γρήγορο για να δημιουρήσω ένα απλό token;

Δημοσίευση από alou » 19 Ιούλ 2016 22:20

Μόνο εμένα μου φαίνεται περίεργο (αν όχι εντελώς λάθος) να έχεις πάνω από ένα csrf token / page χωρίς να συντρέχει σοβαρός λόγος?

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

ποίο από τα τρία είναι το πιο γρήγορο για να δημιουρήσω ένα απλό token;

Δημοσίευση από gvre » 19 Ιούλ 2016 22:57

Όταν διάβασα το μήνυμα υπέθεσα ότι έχει πολλά views στη σελίδα με το token. Τώρα που διάβασα το τελευταίο post είδα ότι μάλλον κατάλαβα λάθος :)
@sibas Όποτε, σε αυτή την περίπτωση, γιατί θέλεις 1000 tokens / σελίδα;

sibas
Honorary Member
Δημοσιεύσεις: 1851
Εγγραφή: 21 Φεβ 2003 01:21
Τοποθεσία: Μια εδώ.. Μια εκεί.. Σήμερα είμαι εδώ!!!
Επικοινωνία:

ποίο από τα τρία είναι το πιο γρήγορο για να δημιουρήσω ένα απλό token;

Δημοσίευση από sibas » 20 Ιούλ 2016 10:51

alou έγραψε:Μόνο εμένα μου φαίνεται περίεργο (αν όχι εντελώς λάθος) να έχεις πάνω από ένα csrf token / page χωρίς να συντρέχει σοβαρός λόγος?
Γιατί το λές αυτό? που είναι το περίεργο το να έχεις πάνω από 2 forms σε μια σελίδα με διαφορετικά csrf στην κάθε form? Και γιατί να υπάρχει πρόβλημα???

@gvre
δουλεύω με php 5.5.35 το random_bytes υπάρχει μόνο στη 7, θα υπάρξουν δοκιμές και για αυτή την version.

Γιατί θέλω 500/1000 τόκενς σε κάθε σελίδα?
σαν admin (έτσι όπως το έχω στήσει το όλο θέμα) μπορεί να δείς τα comments που υπάρχουν στην db και να επιλέξεις πόσα θέλεις να εμφανιστούν για επεξεργασία 50 / 100 / 500 / 1000 κλπ,
έτσι αν επιλέξεις να εμφανιστούν 500, θα εμφανιστούν 500 comments με κάθε ένα από αυτά να έχει button που καλεί εξωτερικό αρχείο για το edit, κάθε button έχει και το scrf του.
Το ίδιο και για της σελίδες που μπορεί να έχουν δημιουργηθεί κλπ κλπ.

με πιο απλά λόγια το scrf είναι σημαντικό για αυτό που φτιάχνω, χρησιμοποιώ παρόμοια csrf σε πολλές άλλες σελίδες μου με απόλυτη επιτυχία, αλλά πρώτη φόρα σε τόση μεγάλη έκταση :)

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

ποίο από τα τρία είναι το πιο γρήγορο για να δημιουρήσω ένα απλό token;

Δημοσίευση από alou » 20 Ιούλ 2016 11:24

@sibas: γιατί πιστεύεις ότι χρειάζεσαι ένα token per form και δεν σε καλύπτει ένα token για όλες τις form που υπάρχουν στη σελίδα? η προτεινόμενη και πάγεια τακτική, αυτή είναι. Ειδικά εφόσον φτάνεις στο σημείο η παραγωγή τους να παίζει ρόλο στην ταχύτητα της εφαρμογής και από όσο φαίνεται δεν συντρέχει κανένας λόγος να το κάνεις έτσι, προφανώς δεν είναι ότι καλύτερο.

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

ποίο από τα τρία είναι το πιο γρήγορο για να δημιουρήσω ένα απλό token;

Δημοσίευση από gvre » 20 Ιούλ 2016 12:06

sibas έγραψε:@gvre
δουλεύω με php 5.5.35 το random_bytes υπάρχει μόνο στη 7, θα υπάρξουν δοκιμές και για αυτή την version.
Υπάρχει και userland implementation για php < 7.

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες