簡體   English   中英

了解散列算法的位和字節

[英]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 步是這樣的:

  1. 從移位和加法實現中可以看出,使用 33 會復制 hash 累加器中的大多數輸入位,然后將這些位分散到相對較遠的地方。 這有助於產生良好的雪崩。 使用較大的移位將復制更少的位,使用較小的移位將使位交互更加局部,並使交互傳播所需的時間更長。

33 是 32+1。 這意味着,由於乘法是分布的, hash * 33 = (hash * 32) + (hash * 1) - 或者換句話說,制作hash的兩個副本,將其中一個向左移動 5 位,然后將它們相加,這就是(hash << 5) + hash以更直接的方式表達的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM