如何生成.NET4 guid?

如何生成.NET4 guid?,.net,.net-4.0,guid,.net,.net 4.0,Guid,我知道问题很多,雷蒙德的优秀(和往常一样)。然而,由于创建guid的算法发生了明显的变化,我发现很难获得任何最新的信息。政府似乎试图提供尽可能少的信息 关于如何在.NET4中生成GUI,我们知道什么?改变了什么,它如何影响安全性(“随机性”)和完整性(“唯一性”) 我感兴趣的一个具体方面是:在v1中,似乎不可能在一台机器上再次生成相同的GUID,因为其中涉及时间戳和计数器。在v4中,情况不再如此(我被告知),因此在一台机器上获得相同GUID的机会。。。由于Microsoft使用版本4算法,增加了

我知道问题很多,雷蒙德的优秀(和往常一样)。然而,由于创建guid的算法发生了明显的变化,我发现很难获得任何最新的信息。政府似乎试图提供尽可能少的信息

关于如何在.NET4中生成GUI,我们知道什么?改变了什么,它如何影响安全性(“随机性”)和完整性(“唯一性”)

我感兴趣的一个具体方面是:在v1中,似乎不可能在一台机器上再次生成相同的GUID,因为其中涉及时间戳和计数器。在v4中,情况不再如此(我被告知),因此在一台机器上获得相同GUID的机会。。。由于Microsoft使用版本4算法,增加了?

由于嵌入MAC地址被视为一种安全风险,在Windows 2000中,Microsoft切换到版本4的GUI。一,

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

版本4 UUID的格式为xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxx,其中x为任何十六进制数字,但y为8、9、A或B中的一个。e、 g.f47ac10b-58cc-4372-a567-0e02b2c3d479

版本4 UUID由122个有效位组成,给出2^122个不同的值,这是一个非常大的数字。给定一组H值,我们在找到概率为50%的第一次随机碰撞之前必须选择的预期值数量可以计算如下(参见Wikipedia):

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


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

是的,.NET 4.0中发生了更改,GUID.NewGuid()直接调用UuidCreate()的一个小包装。早期版本的.NET在CLR中调用了一个helper函数,GuidNative::CompleteGuid()。它调用CoCreateGuid。不知道为什么会做出这样的改变,闻起来只不过是一个小小的优化


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

+1-Guid是由底层操作系统生成的,而不是.NET。NET类只包装了底层的OS API。感谢您的回答和附加链接,这澄清了我的大部分问题。你知道我在最后一段中所做的假设是否正确吗?德克,你能说明这是否也适用于.NET内核吗?我们是否需要研究运行.NET core的任何操作系统API,以找出GUID生成版本?根据,自1999年Windows 2000以来,“所有Windows内置的版本4 GUID的随机位都是通过Windows CryptGenRandom cryptographic API或等效程序获得的,该程序与生成加密密钥的源相同“。所以我想说你可以称它们为加密安全的——至少在它们提供的122位熵的范围内。@JordanRieger:你的说法可能是正确的,但你不应该忘记RFC4122的第6节非常清楚关于UUID值的随机性(包括第4版)的假设:“不要认为UUID很难猜测;它们不应该被用作安全能力“-所以该规范明确地说,您不应该考虑UuIDS加密安全(即使实际的实现将保证)。