7

我正在使用 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

4 回答 4

20

哈希计算经常溢出。这通常根本不是问题,只要你能保证当它溢出时会发生什么。不要忘记散列的意义不在于有一个数字,这意味着在大小等方面 - 它只是一种检测平等的方式。为什么溢出会干扰呢?

于 2010-04-03T15:38:01.027 回答
4

我在想您使用静态/运行时分析器来警告整数溢出?好吧,这是您可以忽略警告的情况之一。哈希函数是为特定类型的属性设计的,所以不用担心分析器的警告。只是不要尝试自己创建哈希函数!

于 2010-04-03T16:29:42.463 回答
4

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

于 2010-04-03T15:39:00.133 回答
1

返回(哈希和 0xFFFFFFFF);// 或者任何你想要的掩码,只要你保持一致就没有关系。

于 2012-02-02T19:02:24.780 回答