【问题标题】:Hashcode generated by EclipseEclipse 生成的哈希码
【发布时间】:2013-04-11 10:03:21
【问题描述】:

在 SO 中,我已经阅读了几个与哈希码实现相关的答案以及使用 XOR 运算符的建议。 (例如Why are XOR often used in java hashCode() but another bitwise operators are used rarely?)。

当我使用 Eclipse 生成哈希码函数时,其中field 是一个对象,timestamp 是一个 long,输出是:

public int hashCode() {
  final int prime = 31;
  int result = 1;
  result = prime * result
        + field == null) ? 0 : field.hashCode());
  return result;
}

不使用下面的异或运算符有什么原因吗?

  result = prime * result + (int) (timestamp ^ (timestamp >>> 32));

【问题讨论】:

  • 我在这里看到了 XOR prime * result + (int) (timestamp ^ (timestamp >>> 32))...
  • @Heuster 那是他的编辑小姐。实际上 Eclipse 只创建了这一行 result = prime * result + field == null) ? 0 : field.hashCode());

标签: java eclipse hashcode


【解决方案1】:

Eclipse 采取了安全的方式。虽然使用素数、乘法和加法的计算方法比单个 XOR 慢,但在您有多个字段的情况下,它会为您提供整体更好的哈希码。

考虑一个简单的例子——一个有两个Strings、ab的类。你可以使用

a.hashCode() ^ b.hashCode()

a.hashCode() * 31 + b.hashCode()

现在考虑两个对象:

a = "ABC"; b = "XYZ"

a = "XYZ"; b = "ABC"

第一种方法将为它们生成相同的哈希码,因为 XOR 是对称的;第二种方法会产生不同的哈希码,这很好,因为对象不相等。通常,您希望不相等的对象尽可能多地具有不同的哈希码,以提高这些对象的基于哈希的容器的性能。 31*a+b 方法比 XOR 更好地实现了这个目标。

请注意,当您处理同一对象的各个部分时,如

timestamp ^ (timestamp >>> 32)

上述论点要弱得多:遇到两个时间戳,它们之间的唯一区别是它们的上下部分交换了比两个对象交换了ab 字段值更难想象。

【讨论】:

    猜你喜欢
    • 2012-12-21
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    • 2020-10-21
    • 2015-05-12
    • 1970-01-01
    相关资源
    最近更新 更多