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

2024-04-04

我正在尝试获取Java对象的唯一哈希值,如下所示:

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

假设该对象包含几个布尔值和整数字段。


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

Gjorgji,我知道您接受下面的答案是正确的,但我发现它是不正确的。

如果你有一堂这样的课:

class tiny {
    int a;
    public int hashCode() { return a; }
}

您已经用尽了所有可能的哈希码。 (如果不清楚原因,请说明。)

因此,如果您向对象添加任何更多信息,如果您希望在 hashCode 中表示该信息,那么您将在某个地方发生冲突。

但是,就此而言,您并不是真的想获取一个对象 100% 唯一的 hashCode。这确实不是 hashCode 的重点!

hashCode 的目的是为您提供一个“足够唯一”的对象标识符,以便您可以将其放入哈希桶中。与其说它是为了识别,不如说是为了分类。这个想法是,如果你有一大堆对象,你可能不会有很多冲突,所以如果你按哈希码对项目进行分组,你可能会非常快速地访问你正在寻找的东西。

如果这意味着您取消选择我的正确答案,那也没关系。这确实不适合您正在寻找的内容。我希望你能意识到thishashCode 的解释引导您正确使用,从而保持正确性。但正如马克明确指出的那样,这实际上并没有解决你所说的问题。

以下是旧答案:

=================================================== =========

一篇关于它的好文章可以在这里找到,来自Effective Java(这是最好的“我想学习如何成为一名优秀的Java开发人员”书。)

http://www.linuxtopia.org/online_books/programming_books/thinking_in_java/TIJ313_029.htm 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;
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java:获取对象的唯一哈希值 的相关文章

随机推荐