[英]Understanding bits and bytes of a hashing algorithm
在一個關於名為 djb2 的非常簡單的散列算法的問題中,作者想知道為什么在算法中選擇了數字 33(參見下面的 C 代碼)。
unsigned long;
hash(unsigned char *str)
{
unsigned long hash = 5381;
int c;
while (c = *str++) //just the character
hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
return hash;
}
在最佳答案中,第 2 點討論了哈希累加器以及它如何復制自身的兩個副本,然后談到了傳播。
有人可以解釋“復制自身”和答案2的“傳播”是什么意思嗎?
被引用的第 2 步是這樣的:
- 從移位和加法實現中可以看出,使用 33 會復制 hash 累加器中的大多數輸入位,然后將這些位分散到相對較遠的地方。 這有助於產生良好的雪崩。 使用較大的移位將復制更少的位,使用較小的移位將使位交互更加局部,並使交互傳播所需的時間更長。
33 是 32+1。 這意味着,由於乘法是分布的, hash * 33 = (hash * 32) + (hash * 1)
- 或者換句話說,制作hash
的兩個副本,將其中一個向左移動 5 位,然后將它們相加,這就是(hash << 5) + hash
以更直接的方式表達的內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.