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

Random 为什么我们需要GUID的规范格式?,random,guid,uuid,bits,canonicalization,Random,Guid,Uuid,Bits,Canonicalization,一天工作很辛苦,我注意到我一直在用常用的.NET的Guid生成。NewGuid()方法在第三个块的开头有相同的编号4: efeafa5f-fe21-4ab4-ba82-b9eefd5fa225 480b64d0-6762-4afe-8496-ac7cf3292898 397579c2-a4f4-4611-9fda-16e9c1e52d6a ... 大约每秒钟屏幕上就会出现10个。我一直在关注这个模式,就在第五个GUID之后。最后,最后一个里面有同样的四个部分,我决定我是一个幸运的家伙。我回到家

一天工作很辛苦,我注意到我一直在用常用的.NET的
Guid生成。NewGuid()
方法在第三个块的开头有相同的编号
4

efeafa5f-fe21-4ab4-ba82-b9eefd5fa225
480b64d0-6762-4afe-8496-ac7cf3292898
397579c2-a4f4-4611-9fda-16e9c1e52d6a
...
大约每秒钟屏幕上就会出现10个。我一直在关注这个模式,就在第五个GUID之后。最后,最后一个里面有同样的四个部分,我决定我是一个幸运的家伙。我回到家,觉得整个世界都为我这样一个与众不同的人敞开了大门。下个星期我找到了一份新工作,打扫了房间,给父母打了个电话

但今天我又面临同样的模式。一千次。我不再觉得自己是被选中的人了

我在谷歌上搜索过它,现在我知道了一个标准格式,其中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();
    }
}
但有一件事我还是不明白(除了如何继续生活)。为什么我们需要这些保留位?我看到了它的危害——暴露内部实现细节,更多冲突(仍然没什么好担心的,但有一天…),更多自杀——但我看不到任何好处。你能帮我找到一些吗


这样,如果您更新了算法,就可以更改该数字。否则,由于不同的原因,两种不同的算法可能会产生完全相同的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或其他种类的时间和空间标识符的组合来保证唯一性的其他方法


有关规范,请参见此处:

大多数开发人员都不考虑在他们的GUI中编码时间或IP。我们只需要会话或其他东西的唯一标识符。但是默认的GUID生成器实现迫使我们记住这些特性。这难道不公平吗?如果你非常担心会丢失4位,那么你应该非常关心使用一个UUID,它不依赖于唯一性的随机机会,如果你使用这样的UUID,那么你需要一个具有版本标识符的UUID。所以,这对我一点也不公平!此外,如果将来您决定切换到一个保证唯一的方法,这个版本ID意味着您不需要担心与遗留ID的冲突。当然,我关心GUID的唯一性
.NET
的生成器(
Guid.NewGuid()
)取决于唯一性的随机概率(这6位除外)。所以我并不真的需要这个版本标识,但关键是有一天你可能想要改变你的方法。既然现在你不需要,一切都很好。但是,如果/当您想要切换它时,您将有一个好处,即不必因为旧值而担心冲突。通过固定这些值(即使在随机版本中),规范保证了升级路径是可用的(即使对于那些不认为他们有一天会升级的人)。如果你100%确定你不需要它,而且永远不会,你可以很容易地制作自己的发电机。但我建议不要这样做。