2011-01-28 12 views
7

Ho bisogno di un algoritmo hash che emetta una stringa alfanumerica lunga 20 caratteri. Per "alfanumerico" intendo [a-zA-Z0-9].Algoritmo hash con output alfanumerico di max. 20 caratteri

ingressi sono UUID s in forma canonica (esempio 550e8400-e29b-41d4-a716-446655440000)

In alternativa c'è un modo per convertire uno SHA1 o MD5 hash per una stringa con queste limitazioni?

Grazie.

EDIT

non ha bisogno di essere crittograficamente sicuro. Le collisioni rendono inaccurati i dati, ma se accadono sporadicamente posso conviverci.

EDIT 2

Non so se troncare MD5 o SHA1 renderebbe collisioni accadono troppo spesso. Ora mi chiedo se è meglio troncare a 20 caratteri un valore MD5 o un valore SHA1.

+0

Avete delle proprietà desiderate per questi hash? Dovrebbero essere crittograficamente sicuri, o semplicemente abbastanza buoni per un hash table? – templatetypedef

+1

Non puoi semplicemente stampare la stringa hash SHA1 o MD5 in esadecimale (o base64) e troncare a 20 caratteri se necessario? –

+1

Qual è il tuo obiettivo? È così che solo una sottostringa di 20 caratteri di un hash SHA1 non funzionerebbe? –

risposta

13

Basta ritagliare i caratteri non necessari dall'hash del GUID. Con una buona funzione di hash, l'imprevedibilità di qualsiasi parte dell'hash è proporzionale alla dimensione della parte. Se vuoi, puoi codificarlo come base 32 invece della base esagonale standard 16. Ricorda che questo non migliorerà in modo significativo l'entropia per personaggio (solo del 25%).

Per usi non crittografici, non importa se si troneggia MD5, SHA1 o SHA2. Nessuno dei due ha evidenti carenze nell'entropia.

+2

Grazie. Ho provato a generare 1 milione di UUID e a prendere i primi 20 caratteri dell'esagono SHA1. Non ho avuto collisioni. Script di prova qui: https://gist.github.com/800132 – Giacomo

Problemi correlati