djb2哈希函数

Jai*_*ish 6 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Jon*_*eet 20

散列计算经常溢出.这是一般根本不是一个问题,只要你这是怎么回事,当它发生的担保不会溢出.不要忘记,哈希的要点不是要有一个数字,这意味着某些方面的分数等等 - 它只是一种检测平等的方法.溢出为什么会干扰?


Luk*_*ský 5

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