我试图获得Java对象的唯一哈希值,如下所示:
If A == B then A.HashValue() == B.Hash.HashValue()If A != B then A.HashValue() != B.HashValue()可以说该对象包含几个布尔和整数字段.
//非常重要的编辑...
Gjorgji,我知道你接受了下面的答案是正确的,但我发现它是不正确的.
如果您有这样的课程:
class tiny {
int a;
public int hashCode() { return a; }
}
Run Code Online (Sandbox Code Playgroud)
您已经最大化了所有可能的哈希码.(如果不清楚原因,请说出来.)
因此,如果您向对象添加任何其他信息,如果您希望在hashCode中表示该信息,那么您将在某处发生冲突.
但是,就此而言,你真的不想开始获得一个对象100%唯一的hashCode.这真的不是hashCode的重点!
hashCode的目的是为对象提供"足够唯一"的标识符,以便将其放在哈希桶中.它不是用于识别,而是用于分类.这个想法是,如果你有一大堆对象,你可能不会有很多碰撞,所以如果按hashCode对项目进行分组,你可能会很快访问你正在寻找的东西.
如果这意味着您取消选择我的答案是正确的,那没关系.对于你正在寻找的东西,这是不正确的.我希望您意识到hashCode的这种解释会引导您正确使用,从而保持正确性.但正如马克明确指出的那样,这实际上并没有解决你所说的问题.
以下是旧答案:
================================================== =========
这里有一篇很好的文章,来自Effective Java(在那里提供最好的"我想学习如何成为一名优秀的Java开发人员"一书.)
http://www.linuxtopia.org/online_books/programming_books/thinking_in_java/TIJ313_029.htm
class Gjorgji {
boolean a;
boolean b;
boolean c;
int x;
int y;
// EDIT: I almost forgot a VERY important rule...
// WHEN YOU OVERRIDE hashCode, OVERRIDE EQUALS (and vice versa)
public int equals(Object o) {
if(!(o instanceof Gjorgji) return false;
Gjorgji g = (Gjorgji)o;
return a == g.a && b == g.b && c == g.c && x == g.x && y == g.y;
}
public int hashCode() {
int hash = x ^ y;
hash *= a ? 31 : 17; // pick some small primes
hash *= b ? 13 : 19;
hash *= c ? 11 : 29;
return hash;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
24129 次 |
| 最近记录: |