2012-05-22 34 views
30

Neden herkes 5317 no'lu DJB hash fonksiyonunda kullanıldığını söyleyebilir mi?DJB hash fonksiyonunda 5381 numara için neden?

DJB Hash fonksiyonu

s (0) = 5381

: (i) 33 * h (i-1)^str [i]

bir C programı =

h:

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; 
} 

cevap

23

5381, testte fewer collisions ve better avalanching ile sonuçlanan bir sayıdır. Hemen her hash algoda "sihirli sabitler" bulacaksınız.

+2

Bu değiştirilen URL'ler beni güldürdü. –

+0

@High İyi bir mizahın içinde olduğunuza sevindim :) Neyse ki, sadece sayıları değiştirmek zorunda kaldı gibi swapping URL'leri süper kolay. –

+0

Yukarıdaki mizahı anlayamadım. –

13

Bu numaraya çok ilginç bir özellik buldum, bunun bir nedeni olabilir.

5381, 709'dur.
709, 127. asaldır.
127, 31'inci asaldır.
31 11. asaldır.
11 5. asaldır.
5 3 asaldır.
3 2. asaldır.
2, 1. asaldır.

5381, bunun 8 kez gerçekleştiği ilk sayıdır. 5381st asal, imzalı int sınırını aşabilir, bu yüzden zinciri durdurmak için iyi bir noktadır.

+0

Bunu nasıl buldunuz? –

+1

https://oeis.org/search?q=5381 5381st üssü, imzalı bir int sınırına yakın değildir. –

+1

@evilotto Bu kodda imzasız int almıştır ve bu değer 52711 değerini saklayabilir. –