hash - 为什么java hashCode()中经常使用XOR,而其他按位运算符却很少使用?

标签 hash hashcode xor

我经常看到这样的代码

int hashCode(){
  return a^b;
}

为什么要进行异或?

最佳答案

在所有位操作中,XOR 具有最好的位混洗属性。

这个真值表解释了原因:

A B AND
0 0  0
0 1  0
1 0  0
1 1  1

A B OR
0 0  0
0 1  1
1 0  1
1 1  1

A B XOR
0 0  0
0 1  1
1 0  1
1 1  0

正如您所见,AND 和 OR 在混合位方面表现不佳。

OR 平均会产生 3/4 个一位。另一方面,AND 将产生平均 3/4 的空位。只有 XOR 具有均匀的一位与空位分布。这使得它对于哈希码生成非常有值(value)。

请记住,对于哈希码,您希望使用尽可能多的 key 信息并获得良好的哈希值分布。如果使用 AND 或 OR,您将得到偏向于带有大量 0 的数字或带有大量 1 的数字的数字。

关于hash - 为什么java hashCode()中经常使用XOR,而其他按位运算符却很少使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2334218/

相关文章:

hash - xkcd : Externalities

java - xdmp :hash64 equivalent in Java

c++ - 具有关联属性的 boost::hash_combine 的替代方案?

ruby - RSpec:在 RSpec 中测试大型哈希

Java编码/解码一个字符串到/从一个长

java - 返回 HashMap 的值

java - 本例对HashMap哈希算法的解释

java - == vs equals vs XOR 基准

java - 大输入数组中的奇数异或对

java - 使用 XOR 和加法对 int 求反