GUID 有一个版本。 GUID 中的第 13 个十六进制数字标记其版本。当前的 GUID 通常是使用版本 4 生成的。如果向后更改版本,则可能会与已经存在的 GUID 发生冲突。向前更改它,您可能会与潜在的未来 GUID 发生冲突。
GUID 也有一个变体。 GUID 中的第 17 个十六进制数字是变量字段。它的一些值是为向后兼容而保留的,一个值是为将来的扩展而保留的。因此,在此处更改某些内容意味着您可能会与以前生成的 GUID 或将来生成的 GUID 发生冲突。
GUID 的结构因版本而异。 第 4 版 GUID 使用(在大多数情况下 - 除了第 17 个十六进制数字)真正随机或伪随机位(在大多数实现中是伪随机)。在那里改变一些东西,你的碰撞概率保持不变。
对于使用哈希的第 3 版和第 5 版 GUID,它应该非常相似,尽管我不记得曾经在野外看到过。不过,对于版本 1 和 2 而言,情况并非如此。那些有一个结构,根据你改变的地方,你会让事情变得困难。
版本 1 GUID 包括时间戳和计数器字段,如果在同一时钟间隔内生成两个 GUID(因此会导致相同的时间戳),则该字段会递增。如果更改时间戳,则可能会与同一台机器上早晚生成的 GUID 发生冲突。如果更改计数器,则可能会与同时生成的 GUID 发生冲突,因此需要将计数器作为“唯一性”。
第 2 版 GUID 在第 1 版的基础上扩展,还包括用户 ID。 时间戳不太准确,并且包含用户或组 ID,而计数器的一部分用于指示是哪一个(但仅对生成机器有意义)。因此,随着这些部分的更改,您可能会与同一台机器上的另一个用户生成的 GUID 发生冲突。
版本 1 和 2 GUID 包括 MAC 地址。 具体来说,生成它们的计算机的 MAC 地址。这确保了来自不同机器的 GUID 是不同的,即使是在同一时刻生成的。如果机器没有 MAC 地址但没有唯一性保证,则存在备用。MAC 地址也有一个结构,由“组织唯一标识符”(OUI;由本地管理或由 IEEE 分发)和网卡的唯一标识符组成。
如果您在 OUI 中进行更改,您可能会与使用其他制造商的网卡的计算机中生成的 GUID 发生冲突。除非您进行更改,使第一个八位字节的次低有效位为 1,在这种情况下,您将切换到本地管理的 OUI,并且只会冒与在具有覆盖 MAC 地址的计算机上生成的 GUID 发生冲突的风险(这可能包括大多数具有虚拟网络硬件的 VM)。
如果您偶然发现卡标识符,则可能会与同一制造商在具有其他网卡的计算机上生成的 GUID 发生冲突,或者再次与 MAC 地址被覆盖的那些计算机上生成的 GUID 发生冲突。
