gpt4 book ai didi

java - 如何制作高效的hashCode?

转载 作者:搜寻专家 更新时间:2023-10-31 08:16:41 27 4
gpt4 key购买 nike

我有如下三个 hashCode 方法,我根据它们的效率对它们进行了优先级排序。我想知道是否有任何其他方法可以制作更高效的 hashCode 方法。

1) public int hashCode() { //terrible
return 5;
}
2) public int hashCode() { //a bit less terrible
return name.length;
}
3) public int hashCode() { //better
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}

最佳答案

没有万无一失的方法可以保证您的 hashcode 函数是最佳的,因为它是由两个不同的指标来衡量的。

  • 效率 - 计算速度有多快。
  • 碰撞 - 碰撞的可能性是多少。

你的:

  1. 以冲突为代价最大限度地提高效率。
  2. 在中间某处找到一个位置 - 但仍然不好。
  3. 效率最低但最适合避免碰撞 - 仍然不一定是最好的。

你必须自己找到平衡点。

有时很明显,存在一种从不冲突的非常有效的方法(例如 enumordinal)。

有时内存这些值是一个很好的解决方案 - 这样即使是非常低效的方法也可以减轻,因为它只计算一次。这有明显的内存成本,也必须加以平衡。

有时代码的整体功能会影响您的选择。假设您想将 File 对象放入 HashMap 中。许多选项很明确:

  1. 使用文件名的哈希码。
  2. 使用文件路径的哈希码。
  3. 使用文件内容的 crc。
  4. 使用文件内容的 SHA1 摘要哈希码。

为什么碰撞不好

hashcode 的主要用途之一是将对象插入到 HashMap 中。该算法从对象请求哈希码并使用它来决定将对象放入哪个桶。如果哈希与另一个对象发生冲突,则该桶中将有另一个对象,在这种情况下,桶将不得不增长,这会花费时间.如果所有哈希值都是唯一的,那么映射将是每个桶一个项目,因此效率最高。

请参阅关于 Hash Table 的优秀维基百科文章深入讨论 HashMap 的工作原理。

关于java - 如何制作高效的hashCode?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32268507/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com