2012-05-22 54 views
30

谁能告诉我为什么数字5381用于DJB哈希函数?DJB哈希函数中5381数字的原因是什么?

DJB哈希函数是

H(0)= 5381

H(1)= 33 * H(I-​​1)^ STR [1]

一个C程序:

unsigned int DJBHash(char* str, unsigned int len) 
{ 
    unsigned int hash = 5381; 
    unsigned int i = 0; 

    for(i = 0; i < len; str++, i++) 
    { 
     hash = ((hash << 5) + hash) + (*str); 
    } 

    return hash; 
} 

回答

23

5381只是一个在测试中导致fewer collisionsbetter avalanching的数字。几乎每个散列算法都会找到“魔法常量”。

+2

那些交换过的网址让我大笑起来。 –

+0

@高我很高兴你的幽默:)幸运的是,交换URLs非常简单,因为我只需要切换数字。 –

+0

我无法理解上述幽默。 –

13

我发现这个数字非常有趣的属性可能是一个原因。

5381是第709个素数。
709是第127个素数。
127是第31个素数。
31是第11个素数。
11是第5个素数。
5是第三个素数。
3是第二个素数。
2是第一个素数。

5381是这种情况发生8次的第一个数字。 5381st prime可能会超出signed int的限制,所以停止链是个好主意。

+0

你是怎么找到这个的? –

+1

https://oeis.org/search?q=5381 5381st prime不会接近signed int的限制。 –

+1

@evilotto在这段代码中,他采用了无符号整数并且可以存储值52711. –