djb2哈希函数

时间:2010-04-03 15:32:42

标签: hash string-hashing

我使用djb2算法为字符串生成哈希键,如下所示

hash(unsigned char *str)
{
    unsigned long hash = 5381;
    int c;

    while (c = *str++)
        hash = ((hash << 5) + hash) + c; /* hash * 33 + c */

    return hash;
}

现在每个循环都有两个大数字的乘法,经过一段时间后,字符串的第5个字符的第4个字符随着散列值变大而出现溢出

重构的正确方法是什么,以便哈希值不会溢出并且哈希也正确发生

4 个答案:

答案 0 :(得分:19)

散列计算经常溢出。这通常不是问题,只要你能确保 溢出时会发生什么。不要忘记,哈希的要点不是要有一个数字,这意味着某些方面的分数等等 - 它只是一种检测平等的方法。为什么溢出会干扰它?

答案 1 :(得分:4)

你不应该这样做。由于没有模数,整数溢出是函数的预期行为(并且在设计时考虑了它)。你为什么要改变它?

答案 2 :(得分:4)

我在想你使用静态/运行时分析器来警告整数溢出?那么这是你可以忽略警告的情况之一。散列函数是针对特定类型的属性而设计的,因此不必担心分析仪发出的警告。只是不要尝试自己创建一个哈希函数!

答案 3 :(得分:0)

return(hash&amp; 0xFFFFFFFF); //或者你想要的任何面具,只要你保持一致就没关系。