UUIDs vom Typ 3 und Typ 5 sind nur eine Technik zum Einfügen eines Hashs in eine UUID.
- Typ 1: Fügt MAC-Adresse + Datum / Uhrzeit in 128 Bit ein
- Typ 3 : Füllt einen MD5-Hash in 128 Bit
- Typ 4: Füllt zufällige Daten in 128 Bit
- Typ 5 : Füllt einen SHA1-Hash in 128 Bit
- Typ 6: Inoffizielle Idee für sequentielle UUIDs
Ein SHA1-Hash gibt 160 Bit (20 Bytes) aus; Das Ergebnis des Hashs wird in eine UUID konvertiert.
Mit dem 20-Byte-Hash von SHA1:
SHA1 Digest: 74738ff5 5367 e958 9aee 98fffdcd1876 94028007
UUID (v5): 74738ff5-5367-5958-9aee-98fffdcd1876
^_low nibble is set to 5, to indicate type 5
^_first two bits set to 1 and 0, respectively
(Beachten Sie, dass die ersten beiden Bits von '9' bereits 1 bzw. 0 sind, sodass dies keine Auswirkung hat.)
Was habe ich Hash?
Sie fragen sich wahrscheinlich, was ich hacken soll. Grundsätzlich haben Sie die Verkettung von:
sha1([NamespaceUUID]+[AnyString]);
Sie stellen Ihrer Zeichenfolge einen sogenannten Namespace voran , um Namenskonflikte zu vermeiden.
Der UUID-RFC definiert vier Namespaces für Sie vor:
NameSpace_DNS
: {6ba7b810-9dad-11d1-80b4-00c04fd430c8}
NameSpace_URL
: {6ba7b811-9dad-11d1-80b4-00c04fd430c8}
NameSpace_OID
: {6ba7b812-9dad-11d1-80b4-00c04fd430c8}
NameSpace_X500
: {6ba7b814-9dad-11d1-80b4-00c04fd430c8}
Sie könnten also zusammen hashen:
StackOverflowDnsUUID = sha1(Namespace_DNS + "stackoverflow.com");
StackOverflowUrlUUID = sha1(Namespace_URL + "stackoverflow.com");
Der RFC definiert dann, wie:
- Nehmen Sie die 160 Bits von SHA1
- und konvertieren Sie es in 128 Bit einer UUID
Der grundlegende Kern ist es , nur die ersten 128 Bits zu nehmen, material a 5
in der Art aufnehmen, und anschließend die ersten beiden Bits des eingestellten clock_seq_hi_and_reserved
Abschnitts auf 1 bzw. 0 ist.
Mehr Beispiele
Nachdem Sie nun eine Funktion haben, die einen sogenannten Namen generiert , können Sie die Funktion (im Pseudocode) haben:
UUID NameToUUID(UUID NamespaceUUID, String Name)
{
byte[] hash = sha1(NamespaceUUID.ToBytes() + Name.ToBytes());
UUID result;
Copy(hash, result, 16);
result[6] &= 0x0F;
result[6] |= 0x50;
result[8] &= 0x3F;
result[8] |= 0x80;
return result;
}
(Beachten Sie, dass die Endianität Ihres Systems die Indizes der oben genannten Bytes beeinflussen kann.)
Sie können Anrufe haben:
uuid = NameToUUID(Namespace_DNS, 'www.stackoverflow.com');
uuid = NameToUUID(Namespace_DNS, 'www.google.com');
uuid = NameToUUID(Namespace_URL, 'http://www.stackoverflow.com');
uuid = NameToUUID(Namespace_URL, 'http://www.google.com/search&q=rfc+4112');
uuid = NameToUUID(Namespace_URL, 'http://stackoverflow.com/questions/5515880/test-vectors-for-uuid-version-5-converting-hash-into-guid-algorithm');
Nun zurück zu Ihrer Frage
Für UUIDs der Versionen 3 und 5 müssen die zusätzlichen Befehlszeilenargumente Namespace und Name angegeben werden. Der Namespace ist entweder eine UUID in Zeichenfolgendarstellung oder eine Kennung für intern vordefinierte Namespace-UUIDs (derzeit bekannt sind "ns: DNS", "ns: URL", "ns: OID" und "ns: X500"). Der Name ist eine Zeichenfolge beliebiger Länge.
Der Namespace ist eine beliebige UUID. Es kann eines der vordefinierten sein, oder Sie können Ihr eigenes erstellen, z.
UUID Namespace_RectalForeignExtractedObject = '8e884ace-bee4-11e4-8dfc-aa07a5b093db'
Der Name ist eine Zeichenfolge beliebiger Länge.
Der Name ist nur der Text, den Sie an den Namespace anhängen, dann hashen und in eine UUID einfügen möchten:
uuid = NameToUUID('8e884ace-bee4-11e4-8dfc-aa07a5b093db', 'screwdriver');
uuid = NameToUUID('8e884ace-bee4-11e4-8dfc-aa07a5b093db', 'toothbrush');
uuid = NameToUUID('8e884ace-bee4-11e4-8dfc-aa07a5b093db', 'broomstick');
uuid = NameToUUID('8e884ace-bee4-11e4-8dfc-aa07a5b093db', 'orange');
uuid = NameToUUID('8e884ace-bee4-11e4-8dfc-aa07a5b093db', 'axe handle');
uuid = NameToUUID('8e884ace-bee4-11e4-8dfc-aa07a5b093db', 'impulse body spray');
uuid = NameToUUID('8e884ace-bee4-11e4-8dfc-aa07a5b093db', 'iPod Touch');
Hinweis : Jeder öffentlich zugängliche Code. Keine Zuordnung erforderlich.