Eclipse生成的Hashcode

时间:2013-04-18 10:25:44

标签: java eclipse hashcode

在SO中,我已经阅读了几个与hashcode实现相关的答案以及使用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;
}

有没有理由不使用下面的XOR运算符?

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

1 个答案:

答案 0 :(得分:3)

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

考虑一个简单的示例 - 包含两个String s,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字段的对象更难想象值。