2010-05-06 9 views
6

Uso MD5 hash para identifying files with unknown origin. No hay atacante aquí, así que no me importa si el MD5 se ha roto y uno puede generar colisiones intencionalmente.¿Puedo utilizar parte del hash MD5 para la identificación de datos?

Mi problema es que necesito proporcionar el registro para que los diferentes problemas sean diagnosticados más fácilmente. Si registro cada hash como una cadena hexadecimal que es demasiado larga, inconveniente y se ve fea, me gustaría acortar la cadena hash.

Ahora sé que solo toma una pequeña parte de un GUID is a very bad idea - Los GUID están diseñados para ser únicos, pero parte de ellos no lo son.

Es lo mismo para MD5 - ¿Puedo decir, por ejemplo, los primeros 4 bytes de MD5 y supongo que solo tengo una probabilidad de colisión mayor debido a la cantidad reducida de bytes en comparación con el hash original?

+0

posible duplicado de http://stackoverflow.com/questions/860405/are-the-first-32-bits-of-an-md5-hash-just-as-random-as-any-other-substring –

+0

Me pregunto si obtener los primeros 4 bytes es mejor que usar el CRC32 del hash md5. –

+0

Sí, porque se supone que los primeros 32 bits en MD5 se distribuyen de forma perfectamente aleatoria, por lo que no se puede mejorar la distribución. –

Respuesta

7

La respuesta corta es sí, puede utilizar los primeros 4 bytes como un id. Cuidado con la paradoja del cumpleaños embargo:

http://en.wikipedia.org/wiki/Birthday_paradox

El riesgo de una colisión aumenta rápidamente a medida que agrega más archivos. Con 50,000, hay aproximadamente un 25% de probabilidad de que consigas una colisión de identificación.

EDIT: Ok, acaba de leer el enlace a su otra pregunta y con 100.000 archivos la probabilidad de colisión es de aproximadamente el 70%.

1

Otra forma de acortar el hash es convertirlo en algo más eficiente que HEX como Base64 o alguna variante del mismo.

Incluso si está decidido a tomar 4 caracteres, tomar 4 caracteres de base64 le da más bits que el hexadecimal.

+0

solo si conviertes el hexágono en su forma 0-F. Todavía puede tomar los valores de bytes sin procesar y usarlos en su lugar. Que en ese caso serían más bits que base-64 – Sekhat

Cuestiones relacionadas