生成GUID的哪种方法最适合确保GUID真的是唯一的?

时间:2013-08-27 17:48:20

标签: c# .net sql-server sqldatatypes

我一直在使用它很长一段时间,但我找不到明确解释何时不能保证唯一。以下是我的意见,请您认为合适。

保证值在创建它的机器上是唯一的(创建)。因此,.net app在计算机上生成的GUID永远不会与SQL Server在同一台计算机上创建的GUID冲突。

在所有其他情况下,无法保证。从理论上讲,如果在不同计算机上的数据库中有唯一标识符字段的多个创建源(比如不同计算机上的应用程序),则总是可能存在重复项。

编辑:抱歉没有正确形成问题。我想我想知道在同一台机器上生成冲突的可能性与不同的机器,如果c#的Guid.NewGuid(),SQL Server的newid()newsequentialid()函数或不同应用程序的任何其他函数是用过的。 “已经回答”的链接有一个回复,其中说它实际上遇到了发生这种情况的案例。让你想知道这种情况经常发生的频率。

如果我有一个带有uniqueidentifier字段的表作为pk,我是否应该在每次插入时通过不同的应用程序或SQL Server的函数创建新值来检查唯一性?

1 个答案:

答案 0 :(得分:17)

  

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

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

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

  

生成GUID的不同机制有哪些?

版本1 GUID组合了当前计算机的MAC地址,当前时间以及一些特定于实现的原点。因此它们在时间和空间上是独一无二的。

第三版和第五版GUID使用唯一字符串的加密强度哈希。它们的碰撞概率基于哈希冲突的概率。

版本四GUID使用伪随机数生成器。它们的碰撞概率是基于PRNG产生碰撞的概率。

  

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

零。

  

在同一台物理计算机上运行两台虚拟机并在每台虚拟机上生成GUID时,第一版GUID发生冲突的概率是多少?

高;如果GUID是在同一时间片中生成的,则它们很可能发生冲突。

如果这样做会有伤害,请不要这样做。

其余的GUID算法不依赖于机器的细节。

  

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

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

  

版本四GUID冲突的概率是多少?

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

给定一组 n v4 GUID将包含至少一次碰撞的概率更难以表达,但只要 n 明显小于 n ,它就非常小2 61