如何生成.NET 4 GUID?

时间:2010-05-03 12:19:43

标签: .net .net-4.0 guid

我知道很多问题here以及雷蒙德的优秀(像往常一样)post。但是,由于创建GUID的算法明显改变,我发现很难掌握任何最新信息。 MSDN似乎试图提供尽可能少的信息。

有关如何在.NET 4中生成GUID的已知信息?改变了什么,它如何影响安全性(“随机性”)和完整性(“唯一性”)?

我感兴趣的一个特定方面:在v1中,似乎几乎不可能在一台机器上再次生成相同的GUID,因为涉及时间戳和计数器。在v4中,情况已经不再如此(我被告知),所以有机会在一台机器上获得相同的GUID ...... 增加

2 个答案:

答案 0 :(得分:51)

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

  

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

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

  

版本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%偶然性的第一次随机碰撞之前我们必须选择的预期值数量可以如下计算(请参阅维基百科上的Birthday Attack):

alt text

2 ^ 122个不同值的结果(生日界限)约为2,89e + 18。这假定生成的值是随机分布的。显然,如果值分布不均匀,则可以更快地发现随机碰撞。有关详细信息,请参阅Random UUID probability of duplicates

1 事实上,由于使用版本1算法生成的GUID,Melissa蠕虫的作者可能是tracked down

答案 1 :(得分:18)

是的,.NET 4.0发生了变化,Guid.NewGuid()直接调用CoCreateGuid(),这是UuidCreate()的一个小包装器。以前版本的.NET在CLR中称为辅助函数GuidNative :: CompleteGuid()。哪个叫CoCreateGuid。不知道为什么要做出这种改变,闻起来只不过是一次小小的优化。

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