Heim > Artikel > Backend-Entwicklung > Ist die von der Uniqid-Funktion von PHP generierte ID wirklich eindeutig?
Ich habe kürzlich uniqid verwendet und habe Fragen? Woraus besteht die von uniqid generierte ID? Ist es wirklich der Einzige? Unter welchen Umständen kommt es zu Konflikten?
Siehe der Dokumentation, dass die Uniqid-Funktion zwei Parameter hat
Die Struktur von Uniqid
Sehen Sie sich den Quellcode an:
PHP_FUNCTION(uniqid) { ... gettimeofday((struct timeval *) &tv, (struct timezone *) NULL); sec = (int) tv.tv_sec; usec = (int) (tv.tv_usec % 0x100000); ... if (more_entropy) { uniqid = strpprintf(0, "%s%08x%05x%.8F", prefix, sec, usec, php_combined_lcg() * 10); } else { uniqid = strpprintf(0, "%s%08x%05x", prefix, sec, usec); } RETURN_STR(uniqid); }
Grundsätzlich verstanden. uniqid besteht aus vier Teilen:
prefix + sec + usec + “.” + php_combined_lcg
wobei Präfix der erste Parameter der uniqid-Funktion ist. Es handelt sich um eine Zeichenfolge, und alles, was übergeben wird, wird direkt zurückgegeben.
sec ist die Sekunde der aktuellen Uhr und usec ist die Millisekunde, beide Werte werden von gettimeofday erhalten. Mit anderen Worten, solange sie sich auf einem Computer befinden, sind die von zwei PHP-Programmen in derselben Millisekunde erhaltenen Sekunden und Usec gleich.
php_combined_lcg wird durch den zweiten Parameter von uniqid bestimmt, der ein Entropiewert ist. Es verwendet lineare Kongruenz, um eine Zufallszahl zwischen 0 und 1 zu generieren. Wenn der zweite Parameter wahr ist, gibt es diesen Wert. Wenn der zweite Parameter falsch ist, gibt es keinen Wert.
Zum Beispiel:
➜ ~ php -r 'echo uniqid("my_", true);'my_5afe9b414c2141.76621929
Fazit
Wenn wir also einfach die uniqid()-Methode ohne Parameter verwenden, kann diese Methode nur garantieren, dass ein einzelner Prozess darin eindeutig ist die gleiche Millisekunde. Bei Verwendung von uniqid("", true). Mit einem Entropiewert verfügt es bereits über eine Zufallsmethode, um die Zufälligkeit der generierten ID sicherzustellen. Da es sich bei der linearen Kongruenz jedoch um einen relativ einfachen Algorithmus zum Generieren von Zufallszahlen handelt, reicht die Zufälligkeit möglicherweise nicht aus. Daher ist im Internet eine eher zufällige numerische Methode im Umlauf:
uniqid(mt_rand(), true)
Unter ihnen generiert mt_rand() Zufallszahlen Anstatt lineare Kongruenz zur Generierung von Zufallszahlen zu verwenden, verwenden Sie den Mersenne-Twister-Zufallszahlengenerator (Messenne-Twister-Algorithmus). Mit anderen Worten, die obige ID wird durch zwei Zufallsalgorithmen + Zeitstempel generiert. Grundsätzlich kann dieser Algorithmus die Eindeutigkeit weitgehend garantieren (wenn Sie nach der Konfliktrate fragen möchten, wird geschätzt, dass ihn nur Mathematikstudenten studieren können ...).
Die oben angegebene ID enthält einen Punkt und die Länge beträgt nicht 128 Bit. Wenn Sie eine UUID generieren möchten, benötigen Sie einen Hash, egal ob MD5 oder SHA1, Sie können ihn auswählen. Es gibt also eine weitere Möglichkeit, einzigartige Codes im Internet zu generieren. (php-Video-Tutorial)
md5(uniqid(mt_rand(), true))
Allerdings ist die Zufälligkeit dieser beiden Methoden im Wesentlichen gleich.
md5(uniqid(mt_rand(), true))----Ich persönlich bezeuge, dass dieser Effekt gut ist, nicht schwer, nur unregelmäßig----Meine eigenen Worte
Das obige ist der detaillierte Inhalt vonIst die von der Uniqid-Funktion von PHP generierte ID wirklich eindeutig?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!