我正在使用以下哈希函数
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
之间的值 - 但会使哈希冲突成为可能
答案 0 :(得分:2)
hash_djb2()
(应该)的输出覆盖整数值的整数,所以如果你实现一个哈希链(即有限数量的桶),你需要使用modulo来缩短范围
顺便说一下,如果你决定只使用函数输出,那么哈希冲突的风险就会降低;使范围变小显然会增加风险。您应该通过允许多个项目存储在相同的哈希值下来管理该风险。