【问题标题】:Are hash functions supposed to return the numerical value of the hash or that value % numBuckets?散列函数是否应该返回散列的数值或该值 % numBuckets?
【发布时间】:2013-02-20 15:18:21
【问题描述】:

我正在使用以下哈希函数

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 之间的值,但可能会发生哈希冲突

【问题讨论】:

  • $numBuckets 是什么?
  • 哈希表中的桶数
  • 基于c version 我会说$hash
  • 我认为c版本只是djb2的一个例子,它是如何工作的。这不是 HashTable 类的 djb2 的工作示例

标签: php hash


【解决方案1】:

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

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

【讨论】:

  • 是的,我知道,我使用链表来允许将多个值存储在哈希值中。 relisoft.com/book/lang/pointer/8hash.html
  • @user784637 好的。顺便说一句,我希望这只是为了教育目的:)
  • 是的,当然!我没有计算机科学学位,所以我只是想学习数据结构的构建块,如哈希表、链表等......
猜你喜欢
  • 2012-06-10
  • 1970-01-01
  • 2010-09-18
  • 2015-01-28
  • 2010-10-29
  • 2014-05-19
  • 2010-11-02
  • 1970-01-01
  • 2011-08-15
相关资源
最近更新 更多