Les UUID de type 3 et de type 5 ne sont qu'une technique de remplissage d'un hachage dans un UUID.
- Type 1: remplit l'adresse MAC + datetime en 128 bits
- Type 3 : bourre un hachage MD5 en 128 bits
- Type 4: remplit les données aléatoires en 128 bits
- Type 5 : remplit un hachage SHA1 en 128 bits
- Type 6: idée non officielle pour les UUID séquentiels
Un hachage SHA1 produit 160 bits (20 octets); le résultat du hachage est converti en UUID.
Avec le hachage de 20 octets de 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
(Notez que les deux premiers bits de «9» sont déjà 1 et 0, respectivement, donc cela n'a aucun effet).
Que dois-je hacher?
Vous vous demandez probablement ce que je suis censé hacher. En gros, vous hachez la concaténation de:
sha1([NamespaceUUID]+[AnyString]);
Vous préfixez votre chaîne avec un soi-disant espace de noms pour éviter les conflits de noms.
La RFC UUID prédéfinit quatre espaces de noms pour vous:
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}
Donc, vous pouvez hacher ensemble:
StackOverflowDnsUUID = sha1(Namespace_DNS + "stackoverflow.com");
StackOverflowUrlUUID = sha1(Namespace_URL + "stackoverflow.com");
La RFC définit ensuite comment:
- prenez les 160 bits de SHA1
- et le convertir en 128 bits d'un UUID
L'essentiel de base est de ne prendre que les 128 premiers bits, de placer un 5
dans l' enregistrement de type , puis de définir les deux premiers bits de la clock_seq_hi_and_reserved
section sur 1 et 0, respectivement.
Plus d'exemples
Maintenant que vous avez une fonction qui génère un soi-disant Nom , vous pouvez avoir la fonction (en pseudo-code):
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;
}
(Notez que l'endian-ness de votre système peut affecter les indices des octets ci-dessus)
Vous pouvez avoir des appels:
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');
Revenons maintenant à votre question
Pour les UUID de la version 3 et de la version 5, l'espace de nom et le nom des arguments de ligne de commande supplémentaires doivent être indiqués. L'espace de noms est soit un UUID dans une représentation sous forme de chaîne, soit un identificateur pour les UUID d'espace de noms prédéfinis en interne (actuellement connus sont «ns: DNS», «ns: URL», «ns: OID» et «ns: X500»). Le nom est une chaîne de longueur arbitraire.
L' espace de noms correspond à l'UUID que vous souhaitez. Cela peut être l'un des prédéfinis, ou vous pouvez créer le vôtre, par exemple:
UUID Namespace_RectalForeignExtractedObject = '8e884ace-bee4-11e4-8dfc-aa07a5b093db'
Le nom est une chaîne de longueur arbitraire.
Le nom est juste le texte que vous souhaitez ajouter à l'espace de noms, puis haché et inséré dans un UUID:
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');
Remarque : tout code publié dans le domaine public. Aucune attribution requise.