的DJB散列函數是基於一個Linear Congruential Generator,其具有形如x =(A·X + C)模m。
通過檢查的功能,我們意識到a = 33
,c = input
在DJB的情況,但因爲它是由可變哈希,在它的原始形式無符號長類型規定的模有點隱蔽,其中包含32位數據。當該值超出無符號長整型的值時,它將溢出並繼續,從而得到2^32的模。
根據Knuth在他的計算機程序設計藝術第2卷:第3.2.1章中的數值算法,m必須被(a-1)的所有素數因子整除,以使線性同餘發生器具有最大週期(週期=模)(以及伯恩斯坦先生已經考慮到的其他事實)。由於具有m = 2^64
沒有引入新的主要因素,因爲根據定義2
既2^32
和2^64
的素數,該規則得到滿足。
你會那麼,這個新的哈希算法,能只要得到一個週期爲您模,這意味着你將包括一個64位整數的所有可能的值。
請記住,雖然,改變算法的任何數學值不能輕易完成。完全理解新算法的缺陷和好處需要進行全新的統計分析,即使您只更改了它的一個變量。你不能簡單地改變數值,並希望得到與原始線性同餘發生器相同的特徵。諸如熵和碰撞之類的統計特徵將不會從前一種算法中保留。然後,您不能聲稱已經實施了DJB的算法,無論是引用DJB的任何統計的表現證明了你的具體實現。
我正在製作一個哈希表,可以運行超過40億行(不太可能,但一種可能性)..另外,碰撞的可能性較低很好... – Ian
@伊恩:謝謝你滿足我的好奇心。這聽起來像你會推動一些界限;那些可以是很好的類型的項目。 –