2011-01-28 17 views
7

Necesito un algoritmo hash que emita una cadena alfanumérica que tenga un máximo de 20 caracteres. Para "alfanumérico" quiero decir [a-zA-Z0-9].Algoritmo hash con una salida alfanumérica de 20 caracteres máximo

Las entradas son UUID s en forma canónica (ejemplo 550e8400-e29b-41d4-a716-446655440000)

En alternativa es que hay una manera de convertir un SHA1 o MD5 de una cadena con estas limitaciones?

Gracias.

EDITAR

no tiene por qué ser criptográficamente seguro. Las colisiones hacen que los datos sean inexactos, pero si ocurren esporádicamente, puedo vivir con eso.

EDIT 2

No sé si truncar MD5 o SHA1 haría colisiones ocurren con demasiada frecuencia. Ahora me pregunto si es mejor truncar a 20 caracteres un valor MD5 o un valor SHA1.

+0

¿Tiene alguna propiedad deseada para estos hash? ¿Deberían ser criptográficamente seguros, o simplemente lo suficientemente buenos para una tabla hash? – templatetypedef

+1

¿No puedes simplemente imprimir la cadena de hash SHA1 o MD5 en hexadecimal (o base64) y truncar a 20 caracteres si es necesario? –

+1

¿Cuál es tu objetivo? ¿Es tal que simplemente tomar una subcadena de 20 caracteres de un hash SHA1 no funcionaría? –

Respuesta

13

Simplemente recorte los caracteres que no necesita del hash del GUID. Con una buena función hash, la imprevisibilidad de cualquier parte del hash es proporcional al tamaño de la parte. Si lo desea, puede codificarla base 32 en lugar de la base hexadecimal estándar 16. Tenga en cuenta que esto no mejorará significativamente la entropía por carácter (solo en un 25%).

Para usos no criptográficos, no importa si trunca MD5, SHA1 o SHA2. Tampoco tiene ninguna flagrante deficiencia en la entropía.

+2

Gracias. Intenté generar 1 millón de UUID y tomar los primeros 20 caracteres del hexágono SHA1. No tengo colisiones. Test script aquí: https://gist.github.com/800132 – Giacomo

Cuestiones relacionadas