math - 通过异或将两个 GUID 组合起来的结果是否满足成为 GUID 的条件?

标签 math guid xor

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

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

最佳答案

GUID 只不过是 0 到 2128 - 1 范围内的统一随机数。从理论上讲,没有什么可以保证它们是唯一的,但如 this question敏锐地表明,由于发生碰撞的可能性极低,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) 发生的可能性相同。

此规则的唯一异常(exception)是如果两个源 GUID 之一全为零,则导致生成的 XOR 与另一个产生冲突。

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

关于math - 通过异或将两个 GUID 组合起来的结果是否满足成为 GUID 的条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21241511/

相关文章:

C如何在unsigned int指针之间进行异或

使用 PHP/MySQL 值的 jQuery 数学

javascript - 如何计算给定数字的ln?

sqlite - 为什么servicestack ormlite将有效的Guid值保存为NULL到SqLite数据库?

c - C/C++ 中的简单 XOR 加密例程

C# 如何在从控制台读取后对数组的所有 int 元素进行异或?

Java:如何创建一个房间,里面有随机生日的人?

r - 计算连续数字之间的差异并用于输出到 R 中的另一个数据帧

ms-access - FireDAC ExecSQL with Params, C++ (or escape GUID braces)

Android 权限和 guid 和 uid