Fangen wir mit dieser beginnen:
Nach UUID Spezifikation, UUID selbst ist sehr gut in die Einzigartigkeit des erzeugten UUID und Chancen der Kollision sind sehr sehr sehr klein.
Eigentlich heißt es das nicht. Das kann man nicht sagen, weil das keinen Sinn ergibt.
In der Tat, wenn die UUID-Spezifikation etwas über die Einzigartigkeit von Typ 4 UUIDs sagt, würde sie sagen, dass sie nur so gut sind wie die Quelle von Zufallszahlen. Und das hängt von der Plattform und der Qualität der RNG & UUID-Implementierungen ab. Wenn wir eine perfekte Quelle von Zufallszahlen annehmen können, dann ist die Wahrscheinlichkeit, dass zwei (getrennt erzeugte) UUIDs gleich sind, in 2 ; d. h. sehr, sehr klein. Auf der anderen Seite, wenn Sie eine schlechte Quelle von Zufallszahlen haben, erhöht sich die Wahrscheinlichkeit der paarweisen Kollision.
Also ist dieses obige Stück Code tatsächlich nicht die Qualität der Einzigartigkeit durch Hashing mit MD5, die eine veraltete Hash-Mechanismus jetzt und anfällig für Kollisionen und Angriffe ist.
Ja. Aber MD5 ist nicht das eigentliche Problem.
Wie @Doug Stevenson sagt, reduziert das Hashing einer UUID die Wahrscheinlichkeit einer Kollision nicht. Nicht einmal für einen Hash-Algorithmus, der keine bekannte Schwäche hat. Was auch immer der Algorithmus ist, es besteht die Möglichkeit, dass Hash-UUIDs die Wahrscheinlichkeit von Kollisionen erhöhen .
Im Grunde hat es keinen Sinn, eine einzelne UUID zu hashen.
Wenn Sie jedoch ein Token mit einer kleineren Kollisionswahrscheinlichkeit als eine UUID vom Typ 4 benötigen, können Sie N UUIDs vom Typ 4 in ein Array mit einem Byte verketten und anschließend einen Hash für das Array erstellen. Wenn Sie einen (starken) M-Bit-Hashalgorithmus und eine perfekte Quelle für Zufallszahlen für Ihren UUID-Generator haben, sollte die Wahrscheinlichkeit einer Kollision etwa 1: 2 min (M, 122 * N) sein.
1 - Das heißt, eine Quelle von Zufallsbits, wo es für jemanden (Angreifer) unmöglich ist, das nächste Bit in der Folge mit etwas anderem als 50% Wahrscheinlichkeit, korrekt vorherzusagen.
2 - Dies ist der Fall, wenn zwei unterschiedliche UUIDs vorhanden sind, die denselben Hashwert haben. Das ist sogar für einen starken Hash-Algorithmus möglich ... es sei denn, Sie haben dies als Kriterium definiert, mit dem Sie die Stärke messen.
Eine zufällige Eingabe über eine Hash-Funktion zu übergeben, ist gleichbedeutend damit, dass nur einmal zufällige Eingaben erhalten werden. –
Übrigens ist dieser Variablenname 'guid' eine falsche Bezeichnung. Ein [GUID - Globally Unique Identifier] (https://en.wikipedia.org/wiki/Globally_unique_identifier) bezieht sich normalerweise auf einen Typ von UUID, der häufig in der Microsoft-Welt verwendet wird. Eine GUID ist sicherlich * nicht * ein MD5-Hash einer UUID. Dieser Variablenname scheint mir eine rote Flagge zu sein, die der Autor dieses Codes nicht vollständig verstanden hat. –
@BasilBourque Ich stimme dir zu :) –