Java:获取对象的唯一哈希值

Gjo*_*gji 6 java

我试图获得Java对象的唯一哈希值,如下所示:

  1. If A == B then A.HashValue() == B.Hash.HashValue()
  2. If A != B then A.HashValue() != B.HashValue()

可以说该对象包含几个布尔和整数字段.

cor*_*iKa 7

//非常重要的编辑...

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)

  • 这并不保证如果`a.hashCode()== b.hashCode()`那么`a == b`. (2认同)