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

ast*_*tef 3 random uuid bits guid canonicalization

一个辛苦的工作日我注意到我用通常的.NET 方法生成的GUID在第三个块的开头Guid.NewGuid()有相同的数字4:

efeafa5f-fe21-4ab4-ba82-b9eefd5fa225
480b64d0-6762-4afe-8496-ac7cf3292898
397579c2-a4f4-4611-9fda-16e9c1e52d6a
...
Run Code Online (Sandbox Code Playgroud)

屏幕上每隔一秒出现一次.在第五个GUID之后,我一直关注这个模式.最后,最后一个内部有相同的四位,我认为我是一个幸运的人.我回到家,觉得整个世界都为我这样一个特殊的人开放.下周我找到了一份新作品,打扫了我的房间并打电话给我的父母.

但今天我又面临同样的模式.千倍.我不再感受到选择的了.

我用谷歌搜索了它,现在我知道了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();
    }
}
Run Code Online (Sandbox Code Playgroud)

但仍然有一件事我不明白(除了如何继续生活).为什么我们需要这些保留位?我看到它会如何伤害 - 暴露内部实施细节,更多碰撞(仍然无需担心,但有一天......),更多的自杀 - 但我没有看到任何好处.你能帮我找到吗?

在GUID生成algorythm

Dav*_*ave 5

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

例如,考虑一种人为的简单UUID格式:

00000000-00000000
  time  -   ip
Run Code Online (Sandbox Code Playgroud)

现在假设我们出于某种原因改变了这种格式:

00000000-00000000
   ip   -  time
Run Code Online (Sandbox Code Playgroud)

当具有IP 12.34.56.78的机器在时间01234567使用第一种方法生成UUID时,这可能产生冲突,之后具有IP 01.23.45.67的第二台机器使用较新的方法在时间12345678生成UUID.但是如果我们为版本标识符保留一些位,则不可能导致冲突.

值4具体指的是随机生成的UUID(因此它依赖于给出如此多位的冲突的微小机会),而不是其他可以使用时间,mac地址,pid或其他种类的时间和空间标识符的组合的方法.保证独特性.

请参阅此处了解相关规范:https://tools.ietf.org/html/rfc4122#section-4.1.3