Hash djb2散列函数

Hash djb2散列函数,hash,string-hashing,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; } hash(无符号字符*str) { 无符号长散列=5381; INTC; 而(c=*str

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

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

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

    return hash;
}
hash(无符号字符*str)
{
无符号长散列=5381;
INTC;
而(c=*str++)

散列=((散列散列计算通常会溢出。只要你能保证溢出时会发生什么,这通常根本不是问题。别忘了散列的要点不是要有一个数字,这在磁振等方面意味着什么——这只是一种检测相等的方法。为什么溢出会干扰那?

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

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

返回(散列&0xFFFFFFFF);//或者你想要的任何掩码,只要你保持一致就无所谓。

没有DJB2哈希,只有标准的DJB,然后是Salsa20等。提到DJB2,我相信这个术语被广泛使用,如果没有正式认可的话。更准确地说:33的乘法(移位和加法)预计会溢出。添加c也是如此。可以说,这是规范的一部分。