random - 为什么我们需要 GUID 的规范格式?

标签 random guid uuid bit canonicalization

在辛苦工作一天后,我注意到 GUIDs我一直使用通常的 .NET 的 Guid.NewGuid() 方法生成,在第三个 block 的开头具有相同的数字 4:

efeafa5f-fe21-4ab4-ba82-b9eefd5fa225
480b64d0-6762-4afe-8496-ac7cf3292898
397579c2-a4f4-4611-9fda-16e9c1e52d6a
...

屏幕上大约每秒出现一次十个。在第五个 GUID 之后我就一直关注这个模式。最后,最后一个里面有相同的四位,我决定我是一个幸运的人。我回到家,感觉整个世界都为我这样一个杰出的人敞开了。下周我找到了一份新工作,打扫了我的房间,并给我的 parent 打了电话。

但今天我又遇到了同样的情况。千次。我再也感觉不到天选之人了。

我用谷歌搜索了一下,现在我知道了 UUID以及规范格式,其中 4 个保留位用于 version,2 个保留位用于 variant

这是一个用于实验的片段:

static void Main(string[] args)
{
    while (true)
    {
        var g = Guid.NewGuid();
        Console.WriteLine(BitConverter.ToString(g.ToByteArray()));
        Console.WriteLine(g.ToString());
        Console.ReadLine();
    }
}

但仍有一件事我不明白(除了如何继续生活)。为什么我们需要这些保留位?我看到它会带来怎样的危害——暴露内部实现细节,更多的冲突(仍然没有什么可担心的,但有一天......),更多的自杀——但我没有看到任何好处。你能帮我找到吗?

Inside GUID generation algorythm

最佳答案

这样一来,如果您更新算法,您就可以更改该数字。否则,两种不同的算法可能会出于不同的原因产生完全相同的 UUID,从而导致冲突。它是版本标识符。

例如,考虑一个设计简单的 UUID 格式:

00000000-00000000
  time  -   ip

现在假设我们出于某种原因将该格式更改为:

00000000-00000000
   ip   -  time

当 IP 为 12.34.56.78 的计算机在时间 01234567 使用第一种方法生成 UUID,随后 IP 为 01.23.45.67 的第二台计算机使用较新的方法在时间 12345678 生成 UUID 时,可能会产生冲突。但如果我们为版本标识符保留一些位,就不可能导致冲突。

值 4 特别指的是随机生成的 UUID(因此它依赖于给定这么多位的微小冲突机会),而不是其他可能使用时间、mac 地址、pid 或其他时间类型组合的方法& 空格标识符以保证唯一性。

请参阅此处了解相关规范:https://www.rfc-editor.org/rfc/rfc4122#section-4.1.3

关于random - 为什么我们需要 GUID 的规范格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27878744/

相关文章:

java - 使用循环和随机生成器的程序(java 入门)

C 编码 : Create Char Array, 打印、重新组织并再次打印

c# - 使用存储在 session 中的 Guid 过滤 Linq

python - 使用 UUIDField 作为主键时如何判断模型实例是否是新的

java - Mac 上的硬件 UUID 是否适合用于许可

python - 从 Pygame Sprite Collision 生成单个随机数,目前生成多个随机数

java - 如果无法使用 SecureRandom,是否可以回退到 Random?

sql-server - 默认值为 SQL Server 表列中的 GUID

幕后的 GUID

java - 在保留唯一性的同时缩短 java UUID