1

我正在使用以下哈希函数

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 和$numBuckets-1 之间的值但使哈希冲突成为可能

4

1 回答 1

2

(should)的输出hash_djb2()涵盖整数值的整个范围,因此如果您正在实现哈希链(即有限数量的桶),则需要使用模来缩短范围。

顺便说一句,只有当您决定只使用函数输出时,哈希冲突的风险才会降低;缩小范围显然会增加这种风险。您应该通过允许将多个项目存储在相同的哈希值下来管理该风险。

于 2013-02-20T07:18:21.590 回答