如果我在写 Employee 类,该类将保存在一些基于哈希的集合中,如hashmap/hashset。应该 Employee 对象 int hashcode() 实现避免或鼓励哈希冲突?特别是对于性能w.r.t插入和检索
Employee
int hashcode()
w8f9ii691#
避免。好的散列算法的要点是将散列对象均匀地分布在可用的散列桶上。考虑退化情况:
int hashCode() { return 0; }
这满足了hashcode实现的所有技术要求。它也绝对保证了碰撞。结果是所有内容都进入同一个bucket,并且(在典型的实现中)哈希Map的性能与数组列表相同。另一方面,在大多数情况下,“少数”碰撞并不明显。你只是不想在任何一个bucket中有太多的条目。在你的特殊情况下 Employee 记录可能具有唯一的“雇员id”。您可以将其用作哈希代码的唯一内容。如果id已经是整数就更好了。对于id模Map大小相同的情况,会在Map(而不是hashcode结果)中发生冲突,但无论如何这是不可避免的。
1条答案
按热度按时间w8f9ii691#
避免。好的散列算法的要点是将散列对象均匀地分布在可用的散列桶上。
考虑退化情况:
这满足了hashcode实现的所有技术要求。它也绝对保证了碰撞。结果是所有内容都进入同一个bucket,并且(在典型的实现中)哈希Map的性能与数组列表相同。
另一方面,在大多数情况下,“少数”碰撞并不明显。你只是不想在任何一个bucket中有太多的条目。
在你的特殊情况下
Employee
记录可能具有唯一的“雇员id”。您可以将其用作哈希代码的唯一内容。如果id已经是整数就更好了。对于id模Map大小相同的情况,会在Map(而不是hashcode结果)中发生冲突,但无论如何这是不可避免的。