Cryptography 为什么XOR是组合散列的默认方式?

Cryptography 为什么XOR是组合散列的默认方式?,cryptography,bit-manipulation,hash,probability,xor,Cryptography,Bit Manipulation,Hash,Probability,Xor,假设你有两个散列H(A)和H(B),你想把它们组合起来。我已经读到,组合两个散列的一个好方法是XOR它们,例如XOR(H(a),H(B)) 我找到的最好的解释是在这里简单地涉及到以下几点: 将两个具有大致随机分布的数字进行异或运算,会得到另一个仍然具有大致随机分布*的数字,但这取决于这两个值。 ... *在要合并的两个数字的每一位,如果两位相等,则输出0,否则输出1。换句话说,在50%的组合中,将输出1。因此,如果两个输入位都有大约50-50%的几率为0或1,那么输出位也将如此。 你能解释为

假设你有两个散列
H(A)
H(B)
,你想把它们组合起来。我已经读到,组合两个散列的一个好方法是
XOR
它们,例如
XOR(H(a),H(B))

我找到的最好的解释是在这里简单地涉及到以下几点:

将两个具有大致随机分布的数字进行异或运算,会得到另一个仍然具有大致随机分布*的数字,但这取决于这两个值。
...
*在要合并的两个数字的每一位,如果两位相等,则输出0,否则输出1。换句话说,在50%的组合中,将输出1。因此,如果两个输入位都有大约50-50%的几率为0或1,那么输出位也将如此。 你能解释为什么XOR应该是组合散列函数的默认操作(而不是or和等)背后的直觉和/或数学吗?

假设均匀随机(1位)输入,函数和输出概率分布为75%
0
和25%
1
。相反,OR是25%
0
和75%
1

XOR函数是50%
0
和50%
1
,因此它有利于组合均匀概率分布

这可以通过写出真值表来看出:

 a | b | a AND b
---+---+--------
 0 | 0 |    0
 0 | 1 |    0
 1 | 0 |    0
 1 | 1 |    1

 a | b | a OR b
---+---+--------
 0 | 0 |    0
 0 | 1 |    1
 1 | 0 |    1
 1 | 1 |    1

 a | b | a XOR b
---+---+--------
 0 | 0 |    0
 0 | 1 |    1
 1 | 0 |    1
 1 | 1 |    0
练习:两个1位输入
a
b
的逻辑函数有多少个具有这种统一的输出分布?为什么XOR最适合您问题中所述的用途?

假设均匀随机(1位)输入,函数和输出概率分布为75%
0
和25%
1
。相反,OR是25%
0
和75%
1

XOR函数是50%
0
和50%
1
,因此它有利于组合均匀概率分布

这可以通过写出真值表来看出:

 a | b | a AND b
---+---+--------
 0 | 0 |    0
 0 | 1 |    0
 1 | 0 |    0
 1 | 1 |    1

 a | b | a OR b
---+---+--------
 0 | 0 |    0
 0 | 1 |    1
 1 | 0 |    1
 1 | 1 |    1

 a | b | a XOR b
---+---+--------
 0 | 0 |    0
 0 | 1 |    1
 1 | 0 |    1
 1 | 1 |    0

练习:两个1位输入
a
b
的逻辑函数有多少个具有这种统一的输出分布?为什么XOR最适合您问题中所述的用途?

如果您使用带有偏置输入的随机输入,则输出是随机的。对于
,情况并非如此。例如:

00101001 XOR 00000000 = 00101001 00101001 AND 00000000 = 00000000 00101001 OR 11111111 = 11111111 00101001 XOR 00000000=00101001 00101001和00000000=00000000 00101001或11111111=11111111 正如@Greg Hewgill所提到的,即使两个输入都是随机的,使用
也会导致输出有偏差


我们在更复杂的东西上使用异或的原因是,没有必要:
XOR
工作得很好,而且速度非常快。

如果你用有偏差的随机输入,输出是随机的。对于
,情况并非如此。例如:

00101001 XOR 00000000 = 00101001 00101001 AND 00000000 = 00000000 00101001 OR 11111111 = 11111111 00101001 XOR 00000000=00101001 00101001和00000000=00000000 00101001或11111111=11111111 正如@Greg Hewgill所提到的,即使两个输入都是随机的,使用
也会导致输出有偏差


我们之所以在更复杂的东西上使用
XOR
,是因为没有必要:
XOR
工作得非常完美,而且速度非常快。

我想为找到此页面的其他人明确指出一点。和或限制输出,如BlueRaja-Danny Pflughoe试图指出的,但可以更好地定义:

首先,我想定义两个简单的函数来解释这一点:Min()和Max()

Min(A,B)将返回A和B之间较小的值,例如:Min(1,5)返回1

Max(A,B)将返回A和B之间较大的值,例如:Max(1,5)返回5

如果给您:
C=A和B

然后你可以发现
C=Max(A,B)
通过这个,我们可以看到AND函数的推论。任何已经是1的位都不能被或为零,所以它保持为1,但每一个零位都有机会成为1,从而成为一个更大的数字

这意味着输入的状态对输出应用了限制。如果你用90和任何东西,你知道输出将等于或小于90,不管其他值是什么


对于XOR,没有基于输入的隐含限制。在某些特殊情况下,如果将一个字节与255进行异或运算,则得到的是相反的结果,但任何可能的字节都可以从中输出。根据另一个操作数中的相同位,每一位都有机会改变状态。

我想为找到此页的其他人明确指出一点。和或限制输出,如BlueRaja-Danny Pflughoe试图指出的,但可以更好地定义:

首先,我想定义两个简单的函数来解释这一点:Min()和Max()

Min(A,B)将返回A和B之间较小的值,例如:Min(1,5)返回1

Max(A,B)将返回A和B之间较大的值,例如:Max(1,5)返回5

如果给您:
C=A和B

然后你可以发现
C=Max(A,B)
通过这个,我们可以看到AND函数的推论。任何已经是1的位都不能被或为零,所以它保持为1,但每一个零位都有机会成为1,从而成为一个更大的数字

这意味着输入的状态对输出应用了限制。如果你用90和任何东西,你知道输出将等于或小于90,不管其他值是什么

对于XOR,没有基于输入的隐含限制。在某些特殊情况下,如果将一个字节与255进行异或运算,则得到的是相反的结果,但任何可能的字节都可以从中输出。根据另一个操作数中的相同位,每一位都有机会改变状态。

Xor可能是组合哈希的“默认”方式,但Greg Hewgill的ans除外
 a | b | a AND b
---+---+--------
 0 | 0 |    0
 0 | 1 |    0
 1 | 0 |    0
 1 | 1 |    1
 a | b | a XOR b
---+---+--------
 0 | 0 |    0
 0 | 1 |    1
 1 | 0 |    1
 1 | 1 |    0