如何生成.NET 4 GUID?

How are .NET 4 GUIDs generated?

我知道这里有很多问题,还有雷蒙德出色(和往常一样)的帖子。但是,由于创建guid的算法发生了明显的变化,我发现很难掌握任何最新的信息。MSDN似乎试图提供尽可能少的信息。

关于如何在.NET 4中生成guid,我们知道些什么?什么发生了变化,它如何影响安全性("随机性")和完整性("唯一性")?

我感兴趣的一个特定方面是:在v1中,似乎不可能在一台机器上再次生成相同的guid,因为它涉及到时间戳和计数器。在v4中,情况不再是这样了(我被告知),所以有机会在一台机器上获得相同的guid…增加?


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

With Windows 2000, Microsoft switched to version 4 GUIDs, since embedding the MAC address was viewed as a security risk. 1

您也可以从.NET中生成的guid(来自维基百科)中看到这一点:

Version 4 UUIDs have the form xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx with any hexadecimal digits for x but only one of 8, 9, A, or B for y. e.g. f47ac10b-58cc-4372-a567-0e02b2c3d479.

版本4 UUID由122个有效位组成,给出2^122个不同的值,这是一个非常大的数字。给定一组h值,我们在发现第一次随机碰撞之前必须选择的值的预期数量(50%的概率)可以计算如下(见维基百科的生日攻击):

alt text

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

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


是的,在.NET 4.0中有一个变化,guid.newguid()直接调用coCreateguid(),这是一个围绕uuidCreate()的小包装。以前版本的.NET在clr中调用了helper函数guidnative::completeguid()。这称为cocreateguid。不知道为什么要进行这种更改,闻起来只不过是一个小的优化。

无论如何,Windows函数生成的guid是完全相同的,在过去的10年里,该算法一直是相同的,与以前一样可靠。