2010-04-03 80 views
6

我使用djb2算法生成的字符串是如下djb2 Hash函數

hash(unsigned char *str) 
{ 
    unsigned long hash = 5381; 
    int c; 

    while (c = *str++) 
     hash = ((hash << 5) + hash) + c; /* hash * 33 + c */ 

    return hash; 
} 

現在每圈有兩個大數字相乘,經過一段時間後與第四散列鍵字符串的第5個字符的有一個溢出作爲哈希值變得龐大

什麼是重構,這樣的哈希值不溢出和散列也恰好正確

+1

有沒有這樣的事情DJB2散列,有唯一的標準DJB,然後Salsa20等人。 – 2010-12-16 00:52:40

+1

http://www.cse.yorku.ca/~oz/hash.html是指DJB2,我相信這個術語被廣泛使用,如果沒有正式承認的話。 – yoyo 2012-12-11 21:19:52

回答

17

哈希計算經常溢出的正確方法。這通常不是問題,只要你有保證當確實會發生溢出時會發生什麼情況。不要忘記,散列點並不是一個數字,這意味着什麼在magniture等方面 - 這只是一種檢測平等的方式。爲什麼溢出會干擾呢?

3

你不應該那樣做。由於沒有模數,因此整數溢出是函數的預期行爲(並且它是在設計時考慮到的)。你爲什麼想改變它?

4

我在想你使用靜態/運行時分析器來警告整數溢出?那麼這是你可以忽略警告的情況之一。散列函數是爲特定類型的屬性而設計的,因此不用擔心分析器的警告。只是不要嘗試自己創建一個哈希函數!

0

return(hash & 0xFFFFFFFF); //或者任何你想要的掩碼,只要你保持一致就沒有關係。