哈希函数是否应该返回哈希值或%numBuckets的值?

时间:2013-02-20 07:13:36

标签: php hash

我正在使用以下哈希函数

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 个答案:

答案 0 :(得分:2)

hash_djb2()(应该)的输出覆盖整数值的整数,所以如果你实现一个哈希链(即有限数量的桶),你需要使用modulo来缩短范围

顺便说一下,如果你决定只使用函数输出,那么哈希冲突的风险就会降低;使范围变小显然会增加风险。您应该通过允许多个项目存储在相同的哈希值下来管理该风险。