Nil*_*nck 89

在所有位操作中,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
Run Code Online (Sandbox Code Playgroud)

正如你所看到的那样,AND和OR在混合位方面做得很差.

OR平均会产生3/4的一位.另一方面,AND将产生平均3/4的空位.只有XOR具有偶数一位与空位分布.这使得它对于哈希码生成非常有价值.

请记住,对于哈希代码,您希望尽可能多地使用密钥信息,并获得良好的哈希值分布.如果您使用AND或OR,您将获得偏向于具有大量零或具有大量数字的数字的数字.


dog*_*ane 19

XOR具有以下优点:

  • 它不依赖于计算的顺序,即a ^ b = b ^ a
  • 它不会"浪费"比特.如果您更改其中一个组件中的一位,则最终值将更改.
  • 它是快速的,甚至是最原始的计算机上的单个循环.
  • 它保持均匀分布.如果你组合的两个部分是均匀分布的,那么组合就是这样.换句话说,它不会将摘要的范围折叠成更窄的范围.

更多信息在这里.

  • 如果*所有输入位都是独立的,则xor操作不会浪费位*,但如果它合并了强相关的位,则可能会浪费很多.例如,如果一个类型具有表示0-65535范围内的一对数字的类型,并通过将这些数字组合在一起形成散列,则每个值中为零的高16位在散列码中将为零.更糟糕的是,如果不成比例的实例(例如10%)两个数字都匹配,则相同比例的实例将为散列返回零. (2认同)

Bha*_*kar 5

XOR 运算符是可逆的,即假设我有一个位串 as0 0 1并且我将它与另一个位串进行异或1 1 1,输出为

0 xor 1 = 1
0     1 = 1
1     1 = 0
Run Code Online (Sandbox Code Playgroud)

现在我可以再次对第一个字符串与结果进行异或以获得第二个字符串。IE

0   1 = 1
0   1 = 1
1   0 = 1
Run Code Online (Sandbox Code Playgroud)

所以,这使得第二个字符串成为一个键。其他位运算符未发现此行为

请参阅此了解更多信息-->为什么在密码学中使用 XOR?

  • hashCode 不需要反转。//对不起,我的英语不好 (4认同)