Si mes calculs sont corrects, je peux rapidement générer une nouvelle valeur de hachage pour la concaténation de deux chaînes si j'ai déjà les valeurs de hachage individuelles pour chaque chaîne. Mais seulement si la fonction de hachage est de la forme:Comment générer rapidement un nouveau hachage de chaîne après la concaténation de 2 chaînes
hash(n) = k * hash(n-1) + c(n), and h(0) = 0.
Dans ce cas,
hash(concat(s1,s2)) = k**length(s2) * hash(s1) + hash(s2)
par exemple.
h1 = makeHash32_SDBM("abcdef", 6);
h2 = makeHash32_SDBM("ghijklmn", 8);
h12 = makeHash32_SDBM("abcdefghijklmn", 14);
hx = mod32_powI(65599, 8) * h1 + h2;
h1 = 2534611139
h2 = 2107082500
h12 = 1695963591
hx = 1695963591
Note that h12 = hx so this demonstrates the idea.
Maintenant, pour la SDBM hash
k=65599
. Alors que le DJB hash
a (ou peut-être 31
?) Et h(0) = 5381
afin de le faire fonctionner, vous pouvez définir h(0) = 0
à la place.
Mais une modification sur le DJB hash
utilise xor
au lieu de +
pour ajouter chaque caractère.
http://www.cse.yorku.ca/~oz/hash.html
Y at-il une autre technique pour calculer rapidement la valeur de hachage des chaînes concaténées si la fonction de hachage utilise xor
au lieu de +
?
Je pense que vous dites que le cas général est de commencer par le hash de la première chaîne et de le traiter comme le h (0) puis alimentez chaque caractère de la deuxième chaîne pour créer le nouveau hachage. – philcolbourn
@philcolbourn, ne supprimez pas l'objet intermidiate qui calcule le hachage pour la première chaîne et vous pourrez continuer la mise à jour de cet objet pour obtenir le hachage des deux chaînes. La plupart des interfaces vers les fonctions de hachage que j'ai vues ont pu continuer plus loin après avoir généré le résultat _hash_ pour les données déjà alimentées. – ony
Dans ces cas, mon objet intermédiaire est la valeur de hachage, mais y a-t-il une formule magique pour le hachage multiplicatif qui utilise 'xor'? – philcolbourn