gpt4 book ai didi

java - Eclipse 生成的哈希码

转载 作者:行者123 更新时间:2023-12-04 05:01:49 24 4
gpt4 key购买 nike

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

当我使用 Eclipse 生成 hashcode 函数时,其中 field是一个对象和 timestamp很长,输出是:

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 的类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)

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

关于java - Eclipse 生成的哈希码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16080430/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com