【发布时间】:2012-08-01 11:10:38
【问题描述】:
Eclipse 源菜单有一个“生成 hashCode / equals 方法”,它可以生成如下所示的函数。
String name;
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj)
{
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
CompanyRole other = (CompanyRole) obj;
if (name == null)
{
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
如果我在生成hashCode() 和equals() 时选择多个字段,Eclipse 使用上面显示的相同模式。
我不是哈希函数方面的专家,我想知道生成的哈希函数有多“好”?什么情况下它会发生故障并导致过多的碰撞?
【问题讨论】:
-
我想它已经足够好了。 Joshua Bloch 在他的书 (Effective Java) 中引用了 hashCode() 和 equals() 的相同实现作为示例。
-
有趣的是,没有一个答案可以解释为什么这段代码是好的。看起来工程师喜欢 Joshua Bloch 的配方,但不幸的是,他似乎是唯一一个明白为什么这个配方很好的人。更新:即使是约书亚也说“即使素数的使用也不太清楚,但它是传统的”。所以我想,即使是他也不得不把这个问题留给其他数学家。
-
Bloch 还写道“虽然这个配方产生了相当好的哈希函数,但它没有产生最先进的哈希函数,Java 平台库也没有在 1.6 版中提供这样的哈希函数。编写这样的哈希函数是一个研究课题,最好留给数学家和理论计算机科学家。”所以如果你真的想知道为什么,你最好回到大学;)
标签: java eclipse hash hashmap hashtable