2009-03-24 27 views
3

Je suis à la recherche d'un algorithme de hachage qui produit un entier signé/non signé de 31/32 bits comme digest pour une chaîne utf8 dans le but d'utiliser la sortie pour ensemencer un prng, tel qu'un Park-Miller-Carta LCG ou un Mersenne-Twister. J'ai examiné FNV1 et FNV1a, mais ils fournissent des valeurs très proches pour des chaînes similaires différant par leur dernier caractère; Je voudrais avoir un hachage de collision faible qui change radicalement sur les modifications minimales sur la chaîne d'entrée. La performance n'est pas un problème.Qu'est-ce qu'un bon algorithme de hachage pour ensemencer un prng avec une chaîne?

Mon approche actuelle consiste en une LCG sale qui utilise des codes de caractères et un nombre premier comme multiplicateurs:

a = 524287; 
for (i = 0; i < n; i ++) 
a = (a * string.charCodeAt (i) * 16807 + 524287) % 2147483647; 

S'il vous plaît laissez-moi de toutes meilleures alternatives.

Répondre

1

Si vous générez une valeur 32 bits, envisagez d'utiliser le CRC32 classique. La FNV est censée être une alternative rapide au CRC, et vous dites que la performance n'est pas un problème.

3

Utilisez SHA-2

Il est le meilleur/dernier algorithme de hachage là-bas. Il est toujours conseillé d'utiliser des algorithmes standard.

1

Tout hachage cryptographiquement fort aura les propriétés que vous voulez, mais générera plus de bits, mais une simple troncature du résultat à 32 bits serait bien. Je suppose que la force cryptographique n'est pas une exigence réelle de sorte que des schémas de hachage imparfaits (mais largement utilisés) comme MD5 seraient adéquats - et facilement disponibles dans de nombreuses bibliothèques.