Pregunta

Creo un GUID (como una cadena) y obtengo el hash de él. ¿Puedo considerar que este hash es único?

¿Fue útil?

Solución

No es tan único como el GUID, no.

Solo para expandir, está reduciendo su singularidad 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á una diferencia. La cosa de 4 bytes fue una suposición, horrible en el mejor de los casos que conozco, de 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 anteriormente con cualquier tamaño de byte que pueda ser tu hash.

Otros consejos

En una palabra, no.

Supongamos que su hash tiene menos bits que el GUID, según el principio de la casilla de verificación, debe existir más de una asignación de algún GUID: > hash simplemente porque hay menos hashes que GUIDS.

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

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

Los algoritmos de hash buenos minimizan la probabilidad de que esto suceda y, en general, a mayor cantidad de bits en el hash, menor probabilidad de colisión.

no está garantizado , debido a colisiones de hash . El GUID en sí mismo está casi garantizado que lo sea.

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

No, y no asumiría la singularidad de ningún valor hash. Eso no debería importar porque los valores hash no necesitan ser únicos, solo necesitan distribuirse de manera uniforme en todo su rango. Cuanto más uniforme es la distribución, menos colisiones ocurren (en la tabla hash). Menos colisiones significan un mejor rendimiento de tabla hash.

fyi Para obtener una buena descripción de cómo funcionan las tablas hash, lea la respuesta aceptada en ¿Qué son las tablas hash y los mapas de hash y sus casos de uso típicos?

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

Me gustaría hacer un hash de un GUID a tamaño X, dándome cuenta de que a veces tengo 10 o menos GUID en el set, por lo que podría obtener un hash más corto sin colisión que si tuviera 10,000,000 GUID en un set. Solo me gustaría poder especificar el tamaño del hash cuando llame a la función.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top