Eclipse生成的Hashcode
在SO中,我已经阅读了几个与hashcode实现相关的答案以及使用XOR运算符的建议。 (例如, 为什么XOR经常在java hashCode()中使用,但很少使用其他按位运算符? )。
当我使用Eclipse生成hashcode函数时, 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));
Eclipse采取安全的方式。 尽管使用素数,乘法和加法的计算方法比单个XOR慢,但在有多个字段的情况下,它会为您提供总体更好的哈希码。
考虑一个简单的例子 – 一个带有两个String
, a
和b
。 您可以使用
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)
上面的论点要弱得多:遇到两个时间戳,使得它们之间的唯一区别是它们的上部和下部交换比两个交换a
和b
字段值的对象更难想象。