Los UUID de tipo 3 y tipo 5 son solo una técnica para rellenar un hash en un UUID.
- Tipo 1: rellena la dirección MAC + fecha y hora en 128 bits
- Tipo 3 : mete un hash MD5 en 128 bits
- Tipo 4: almacena datos aleatorios en 128 bits
- Tipo 5 : rellena un hash SHA1 en 128 bits
- Tipo 6: idea no oficial para UUID secuenciales
Un hash SHA1 genera 160 bits (20 bytes); el resultado del hash se convierte en un UUID.
Con el hash de 20 bytes 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
(Tenga en cuenta que los dos primeros bits de '9' ya son 1 y 0, respectivamente, por lo que esto no tiene ningún efecto).
¿Qué hago hash?
Probablemente se esté preguntando qué es lo que se supone que debo hacer. Básicamente, hash la concatenación de:
sha1([NamespaceUUID]+[AnyString]);
Prefija su cadena con un espacio de nombres para evitar conflictos de nombres.
El UUID RFC define previamente cuatro espacios de nombres para usted:
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}
Entonces, podrían hash juntos:
StackOverflowDnsUUID = sha1(Namespace_DNS + "stackoverflow.com");
StackOverflowUrlUUID = sha1(Namespace_URL + "stackoverflow.com");
El RFC luego define cómo:
- tomar los 160 bits de SHA1
- y convertirlo en 128 bits de un UUID
La esencia básica es tomar solo los primeros 128 bits, rellenar a 5
en el registro de tipo y luego establecer los dos primeros bits de la clock_seq_hi_and_reserved
sección en 1 y 0, respectivamente.
Más ejemplos
Ahora que tiene una función que genera un llamado Nombre , puede tener la función (en pseudocódigo):
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;
}
(Tenga en cuenta que la endianidad de su sistema puede afectar los índices de los bytes anteriores)
Puedes tener llamadas:
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');
Ahora volvamos a tu pregunta
Para los UUID de la versión 3 y la versión 5, se debe proporcionar el nombre y el espacio de nombres de los argumentos de la línea de comandos adicionales. El espacio de nombres es un UUID en representación de cadena o un identificador para los UUID de espacio de nombres predefinidos internamente (actualmente conocidos son "ns: DNS", "ns: URL", "ns: OID" y "ns: X500"). El nombre es una cadena de longitud arbitraria.
El espacio de nombres es el UUID que desee. Puede ser uno de los predefinidos, o puede crear uno propio, por ejemplo:
UUID Namespace_RectalForeignExtractedObject = '8e884ace-bee4-11e4-8dfc-aa07a5b093db'
El nombre es una cadena de longitud arbitraria.
El nombre es solo el texto que desea agregar al espacio de nombres, luego hash y relleno en 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');
Nota : Cualquier código publicado en el dominio público. No se requiere atribución.