C# 哪种方法生成GUID';s是确保GUID真正唯一的最佳方法?

C# 哪种方法生成GUID';s是确保GUID真正唯一的最佳方法?,c#,.net,sql-server,sqldatatypes,C#,.net,Sql Server,Sqldatatypes,我已经用了很长时间了,但我找不到明确的解释,什么时候不能保证它是唯一的。这里是我的意见,请纠正你认为合适的 价值在其创建的机器上保证是唯一的(以任意方式创建)。因此,由.net应用程序在计算机上生成的GUID永远不会与SQL Server在同一台计算机上创建的GUID冲突 在所有其他情况下,没有任何保证。从理论上讲,如果在不同计算机上的db中有多个唯一标识符字段的创建源(例如,不同计算机上的应用程序),则可能会插入重复项 编辑:抱歉没有正确地提出问题。我想我想知道在同一台机器上与不同的机器上生成

我已经用了很长时间了,但我找不到明确的解释,什么时候不能保证它是唯一的。这里是我的意见,请纠正你认为合适的

价值在其创建的机器上保证是唯一的(以任意方式创建)。因此,由.net应用程序在计算机上生成的GUID永远不会与SQL Server在同一台计算机上创建的GUID冲突

在所有其他情况下,没有任何保证。从理论上讲,如果在不同计算机上的db中有多个唯一标识符字段的创建源(例如,不同计算机上的应用程序),则可能会插入重复项

编辑:抱歉没有正确地提出问题。我想我想知道在同一台机器上与不同的机器上生成冲突的概率,如果使用c#的
Guid.NewGuid()
、SQL Server的
newid()
newsequentialid()
函数或不同应用程序使用的任何其他函数。“已经回答”链接有一个回复,上面说他确实遇到了这样的情况。让你想知道这种情况发生的频率有多高

如果我有一个表,其主键是uniqueidentifier字段,那么每次插入时,我是否需要通过不同的应用程序或SQL Server函数创建新值来检查唯一性

我想我想知道在同一台机器上与不同机器上生成冲突的概率,如果c#的
Guid.NewGuid()
、SQL Server的
newid()
newsequentialid()
函数或不同应用程序的任何其他函数

这是一个不可能广泛的问题。“不同应用程序中的任何其他功能”不是我们可以推理的

相反,让我们提出一个可回答的问题,然后回答它

生成guid的不同机制是什么

版本一的guid结合了当前机器的MAC地址、当前时间和一些特定于实现的源代码。因此,它们在时间和空间上都是独一无二的

版本3和版本5的GUI使用唯一字符串的加密强度散列。它们的冲突概率基于哈希冲突的概率

版本4的GUI使用伪随机数生成器。其碰撞概率基于PRNG产生碰撞的概率

假设机器具有唯一的MAC地址,那么在两台不同的机器上发生版本1 GUID冲突的概率是多少

在同一物理机上运行两个虚拟机并在每个虚拟机上生成GUID时,版本1 GUID冲突的概率是多少

高;如果guid是在同一时间片中生成的,那么它们发生冲突的概率很高

如果你那样做很痛,就不要这样做

其余的GUID算法不依赖于机器的详细信息

如果源字符串是唯一的,那么版本3或版本5的GUID与另一个发生冲突的概率是多少

概率与版本四GUID冲突的概率大致相同,所以让我们考虑一下。

版本4 GUID冲突的概率是多少

给定的v4 GUID与一组n个唯一的v4 GUID中的任何v4 GUID发生冲突的概率为n除以2122


给定一组n v4 GUID将包含至少一个冲突的概率很难表达,但只要n明显小于261,它就非常小。

您应该阅读Eric Lippert的GUID指南系列:或者至少是RFC-我很确定您不是在询问
uniqueidentifier
数据类型。您可能会询问
newid
函数,或者可能是
newsequentialid
函数。这两个函数的答案完全不同,如果您指的是其他函数,答案可能也不同。@OP:Per Stephen Cleary(),SQL顺序GUID不符合RFC。Stephen(在“数据库问题”一节中)指出,结果是它们与其他(符合RFC的)GUI发生冲突的可能性增加了当n小于2^61时,n²/2n²应该是“给定一组n v4 guid将包含至少一个冲突的概率”的合理近似值。