Heim  >  Artikel  >  Backend-Entwicklung  >  Ist die von der Uniqid-Funktion von PHP generierte ID wirklich eindeutig?

Ist die von der Uniqid-Funktion von PHP generierte ID wirklich eindeutig?

步履不停
步履不停Original
2019-06-06 15:48:323800Durchsuche

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

Ist die von der Uniqid-Funktion von PHP generierte ID wirklich eindeutig?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn