[英]What's the rationale behind this hash function?
uint32_t h(const char *kbuf, int ksiz){
uint32_t hash = 751;
const char *rp = kbuf + ksiz;
while(ksiz--){
hash = (hash * 31) ^ *(uint8_t *)--rp;
}
return hash;
}
為什么要用這種方式計算哈希,這是什么原理?
您的哈希算法遵循相同的思想,該思想導致修改后的Bernstein哈希和Fowler / Noll / Vo(例如,參見現有哈希算法的此概述 )。
XORing字節是一種經典的哈希算法。 但是,結果散列值的分布遠非最佳,因此添加了一個額外的混合步驟(在這種情況下乘以31
)。
Josh Bloch在Effective Java中解釋了使用31
作為乘數:
選擇值31是因為它是奇數質數。 如果是偶數且乘法運算溢出,則信息將丟失,因為乘以2等於移位。 使用質數的優勢尚不清楚,但這是傳統的。 31的一個不錯的特性是乘法可以用移位和減法來代替,以獲得更好的性能:31 * i ==(i << 5)-i。 現代VM自動執行這種優化。
在原始的伯恩斯坦散列中選擇33
作為乘數可能是遵循類似的推理。 但是,如果您不是主要關注散列性能,則選擇乘數可帶來更好的分布可能會更好。 如果您不想嘗試自己,Fowler / Noll / Vo可能是一個不錯的選擇。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.