.NET 4 GUID是如何生成的?

我知道这里还有很多问题,以及雷蒙德(和往常一样)出色的职位 。 但是,由于创buildGUID的algorithm显然发生了变化,所以我很难掌握任何最新的信息。 MSDN似乎尝试尽可能less地提供信息。

.NET 4中如何生成GUID是什么? 什么改变了,它是如何影响安全性(“随机性”)和完整性(“唯一性”)?

我感兴趣的一个具体方面是:在v1中,似乎几乎不可能在单个机器上再次生成相同的GUID,因为存在时间戳和计数器。 在v4中,这不再是这种情况(我被告知),所以有机会在单个机器上获得相同的GUID … 增加了

从Windows 2000开始, Microsoft使用版本4algorithm:

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

您可以从.NET中(从维基百科 )生成的GUID中看到:

版本4的UUID具有xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx的forms,对于x只有任何hex数字,但对于yeg f47ac10b-58cc-4372-a567-0e02b2c3d479,只有8,9,A或B中的一个。

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

替代文字

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

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

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

无论如何,完全相同的Windows函数会生成Guid,algorithm在过去的10年里一直是一样的,它和以前一样可靠。