如何生成.NET 4 GUID?

maf*_*afu 43 .net guid .net-4.0

我知道这里有很多问题以及雷蒙德的优秀(通常)帖子.但是,由于创建GUID的算法明显改变,我发现很难掌握任何最新信息.在MSDN似乎试图提供尽可能少的信息成为可能.

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

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

Dir*_*mar 52

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

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

你也可以从.NET(来自维基百科)中生成的GUID中看到它:

版本4 UUID具有xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx形式,其中x的任何十六进制数字,但是对于yeg f47ac10b-58cc-4372-a567-0e02b2c3d479,只有8,9,A或B中的一个.

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

替代文字

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

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

  • +1 - GUID由底层操作系统生成 - 而不是.NET..NET类只包装底层OS API. (12认同)

Han*_*ant 18

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

无论如何,完全相同的Windows函数生成Guid,算法在过去10年中一直相同,它与以往一样可靠.