通过XOR合并两个GUID的结果是否满足成为GUID的条件?

i_a*_*orf 3 math guid xor

给定两个GUID,A和B,我执行C = A ^B。结果是GUID吗?

(如果是这样,我可以使用它代替生成第三个guid来表示包含由A和B表示的两个对象的对象。)

nic*_*las 6

GUID只是0到2 128-1范围内的统一随机数。从理论上讲,没有什么可以保证它们是唯一的,但是正如这个问题清楚地表明的那样,由于GUID在实践中是唯一的发生碰撞的可能性极低。

鉴于只有两个要满足的要求:1)范围和2)均匀随机性,很容易证明两个GUID的XOR确实是GUID。

想象一下,如果GUID只有两位,那么我们可以检查所有可能的情况:

 ^ 00 01 10 11
00 00 01 10 11
01 01 00 11 10
10 10 11 00 01
11 11 10 01 00

所有可能的结果1)的范围都在00到11之间,而2)的可能性相同。

该规则的唯一例外是,如果两个源GUID之一全为零,则导致结果XOR与另一个GUI产生冲突。

请注意,XOR不是唯一具有此功能的操作-添加两个GUID并截断溢出位也会生成一个GUID。

  • 是的,但是......回到过去的糟糕日子,GUID 是根据(可能)多个输入构建的 - 其中只有一部分是统一随机的(因为可以对随机进行建模)。GUID 应该使用第一个字节的前三位来指示源。不知道这是否仍然是常见做法。维基百科 [说](https://en.wikipedia.org/wiki/Globally_unique_identifier) 随机源 GUID 仍应包含 6 个固定位 - 仍然是一个很好的大分布 - 但这使规范组合稍微复杂化。组合后您可能应该恢复 6 个固定位。 (2认同)