2012-05-22 53 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. –