2013-02-20 83 views
1

我使用下面的散列函數散列函數是否應該返回散列的數值或該值%numBuckets?

function hash_djb2($str){ 
    $hash = 5381; 
    $length = strlen($str); 

    for($i = 0; $i < $length; $i++) { 
     $hash = (($hash << 5) + $hash) + ord(strtolower($str[$i])) - 96;   
    } 
    return $hash; 
} 

我應該回到$hash$hash % $numBuckets其中$numBuckets是哈希表中桶的數量?

前者將返回真正大的數,使哈希衝突是不可能的,而後者只返回0和-1 $numBuckets之間的值,但使哈希衝突可能

+0

什麼是'$ numBuckets'? – 2013-02-20 07:14:41

+0

哈希表中桶的數量 – user784637 2013-02-20 07:15:24

+0

基於[c版本](http://stackoverflow.com/questions/2571683/djb2-hash-function)我會說'$哈希' – complex857 2013-02-20 07:17:00

回答

2

hash_djb2()輸出(應該)覆蓋的全譜整數值,所以如果你正在實現一個哈希鏈(即有限數量的桶),你將需要使用模數來縮短範圍。

順便說一句,如果您決定只使用函數輸出,散列衝突的風險只會降低;使得範圍變小顯然增加了風險。您應該通過允許將多個項目存儲在相同的散列值下來管理該風險。

+0

是啊我知道,我使用鏈表來允許將多個值存儲在散列值中。 http://www.relisoft.com/book/lang/pointer/8hash.html – user784637 2013-02-20 07:24:04

+0

@ user784637好的。順便說一句,我希望這只是爲了教育目的:) – 2013-02-20 07:25:29

+0

耶!當然!我沒有CS學位,所以我只是想學習哈希表,鏈表等數據結構的構建塊...... – user784637 2013-02-20 07:38:26