【问题标题】:Why is the given hash function a poor hash function?为什么给定的哈希函数是一个糟糕的哈希函数?
【发布时间】:2017-05-04 08:56:49
【问题描述】:

假设哈希表是一个索引为 0 到 HASHSIZE-1 的数组。该函数返回一个正确范围内的值,并且不会产生任何运行时错误。假设传入的 String 至少有 2 个字符。为什么它是一个糟糕的哈希函数?

public static int hash(String key) {
    return (key.charAt(0)
            + key.charAt(1)
            + key.charAt(key.length()-1) % HASHSIZE;
}

【问题讨论】:

  • 看来会有很多碰撞,很差。
  • 检查分布
  • 它似乎也忽略了大部分字符串的内容,这有点没用。
  • 为什么不使用 String.hashCode() ?
  • 这也会在小字符串上引发 IndexOutOfBoundsException。

标签: java hash


【解决方案1】:

哈希函数的质量取决于它们在预期的键群中产生的冲突次数。好的函数可以减少不同键产生相同哈希码的情况。

这种方法的质量取决于所使用密钥的预期长度。对于长度为 3 的键,这是一种完全可以接受的方法,尽管它并不理想,因为哈希不会根据字母顺序而改变。

对于长度为 10 的键,此方法会为从同一对字母开始且结尾具有相同字母的所有键生成冲突。当两个首字母和最后一个字母组合重复很多时,就会发生冲突,从而降低这个哈希函数的用处。

【讨论】:

  • 另外,该函数不会使用完整的int 范围;结果永远不会超过 196605,因此如果HASHSIZE 大于此值,则表的上半部分将完全未被使用,而下半部分则有很多可避免的冲突。
猜你喜欢
  • 1970-01-01
  • 2011-06-04
  • 2010-09-07
  • 2019-08-01
  • 2015-04-29
  • 2018-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多