我一直在使用它很长一段时间,但我找不到明确解释何时不能保证唯一。以下是我的意见,请您认为合适。
保证值在创建它的机器上是唯一的(创建)。因此,.net app在计算机上生成的GUID永远不会与SQL Server在同一台计算机上创建的GUID冲突。
在所有其他情况下,无法保证。从理论上讲,如果在不同计算机上的数据库中有唯一标识符字段的多个创建源(比如不同计算机上的应用程序),则总是可能存在重复项。
编辑:抱歉没有正确形成问题。我想我想知道在同一台机器上生成冲突的可能性与不同的机器,如果c#的Guid.NewGuid()
,SQL Server的newid()
,newsequentialid()
函数或不同应用程序的任何其他函数是用过的。 “已经回答”的链接有一个回复,其中说它实际上遇到了发生这种情况的案例。让你想知道这种情况经常发生的频率。
如果我有一个带有uniqueidentifier字段的表作为pk,我是否应该在每次插入时通过不同的应用程序或SQL Server的函数创建新值来检查唯一性?
答案 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