.NET 4 GUID如何生成?

我知道这里有很多问题,还有雷蒙德(Raymond)出色的(与往常一样)帖子。 但是,由于创建GUID的算法已发生明显变化,因此我发现很难获得任何最新信息。 MSDN似乎尝试提供尽可能少的信息。

关于.NET 4中GUID的生成方式有什么了解? 发生了什么变化,它如何影响安全性(“随机性”)和完整性(“唯一性”)?

我感兴趣的一个特定方面:在v1中,由于涉及时间戳和计数器,因此似乎不可能在一台计算机上再次生成相同的GUID。 在v4中,情况不再如此(有人告诉我),所以在单台计算机上获得相同GUID的机会增加了吗?

mafu asked 2020-08-02T10:31:55Z
2个解决方案
52 votes

由于Windows 2000 Microsoft使用版本4算法:

在Windows 2000中,由于嵌入MAC地址被视为存在安全风险,因此Microsoft切换到了版本4 GUID。 1个

您也可以从.NET(来自Wikipedia)中生成的GUID中看到这一点:

第4版UUID的格式为xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx,其中x带有任何十六进制数字,而y只能是8、9,A或B中的一个。 例如 f47ac10b-58cc-4372-a567-0e02b2c3d479。

版本4 UUID由122个有效位组成,给出2 ^ 122个不同的值,这是一个非常大的数字。 给定一组H值,可以按以下方式计算在找到具有50%机会的第一次随机碰撞之前必须选择的期望值数(请参阅Wikipedia上的Birthday Attack):

alt text

2 ^ 122个不同值的结果(生日界)约为2,89e + 18。 假设生成的值是随机分布的。 显然,如果这些值分布不均匀,则可以更快地发现随机碰撞。 有关更多详细信息,请参见重复的随机UUID概率。

1事实上,由于使用版本1算法生成的GUID,可以跟踪Melissa蠕虫的作者。

Dirk Vollmar answered 2020-08-02T10:32:49Z
18 votes

是的,.NET 4.0中发生了变化,Guid.NewGuid()直接调用CoCreateGuid(),它是围绕UuidCreate()的小包装。 .NET的早期版本在CLR中称为GuidNative :: CompleteGuid()。 哪个调用CoCreateGuid。 不知道为什么要进行此更改,闻起来仅是次要的优化。

无论如何,Windows Guid完全相同的功能会生成Guid,在过去的10年中,算法一直是相同的,它与以往一样可靠。

Hans Passant answered 2020-08-02T10:33:15Z
translate from https://stackoverflow.com:/questions/2757910/how-are-net-4-guids-generated