2008-09-26 13 views
19

Creo un GUID (como una cadena) y obtengo el hash del mismo. ¿Puedo considerar este hash como único?¿El hash de un GUID es único?

+1

Además, la mayoría de las respuestas son un tanto al azar y menos útiles de lo que podrían ser, porque nadie realmente entiende la pregunta y su intención subyacente. La aclaración hará que esta pregunta y sus respuestas sean más útiles. – bzlm

Respuesta

17

No es tan confiablemente único como el GUID en sí, no.

Solo para expandir, está reduciendo su unicidad en un factor de 4, pasando de 16 bytes a 4 bytes de combinaciones posibles.

Como se señala en los comentarios, el tamaño del hash hará la diferencia. La cosa de 4 bytes fue una suposición, horrible en el mejor de los casos, sé que se puede usar en .NET, donde el tamaño de hash predeterminado es de 4 bytes (int). Así que puedes reemplazar lo que dije arriba con cualquier tamaño de byte que tu hash pueda ser.

+3

4 si el algoritmo de hash es perfecto y el hash contiene 4 veces menos bits que el GUID, los cuales pueden variar dependiendo del contexto, ¿no? – bzlm

+1

Los hash criptográficos (por ejemplo, MD5, SHA1) tienen 16-20 o más bytes.Al mezclar el GUID con dicho hash, no reducirá la exclusividad. – zvrba

+1

De hecho, el riesgo de colisión podría * aumentar * después de hash, incluso si el hash es más grande que el GUID. Depende del algoritmo. – bzlm

2

Es no garantizado ser, debido a colisiones hash. El GUID en sí mismo está casi garantizado.

Por razones prácticas, probablemente pueda asumir que un hash es único, pero ¿por qué no usar el GUID?

6

En una palabra, no.

Supongamos que su hash tiene menos bits que el GUID, por el principio del casillero, debe existir más de un mapeo de algunos GUID -> hash simplemente porque hay menos hashes que GUIDS.

Si suponemos que el hash tiene un número mayor de bits que el GUID, existe una posibilidad muy pequeña, pero finita, de una colisión, suponiendo que está utilizando una buena función hash.

4

Ninguna función hash que reduce un bloque de datos de tamaño arbitrario a un número de bits de tamaño fijo producirá una correspondencia de 1 a 1 entre los dos. Siempre existirá la posibilidad de que se reduzcan dos bloques de datos diferentes a la misma secuencia de bits en el hash.

Los buenos algoritmos hash minimizan la probabilidad de que esto ocurra, y en general, cuantos más bits haya en el hash, menor será la posibilidad de una colisión.

2

No, y no asumiría la exclusividad de ningún valor hash. Eso no debería importar porque los valores de hash no necesitan ser únicos, solo necesitan distribuirse uniformemente en todo su rango. Cuanto más pareja sea la distribución, menos colisiones tendrá lugar (en la tabla hash). Menos colisiones significan mejor rendimiento de hashtable.

FYI Para una buena descripción de cómo las tablas hash de trabajar, leer la respuesta aceptada a What are hashtables and hashmaps and their typical use cases?

0

Si utiliza código criptográfico (MD5, SHA1, RIPEMD160), el hash será único (módulo colisiones que son muy improbables - SHA1 se usa, por ejemplo, para firmas digitales, y MD5 también es resistente a colisiones en entradas aleatorias). Sin embargo, ¿por qué quieres hash un GUID?

Cuestiones relacionadas