Bri*_*ian 5 .net c# sql-server sqldatatypes
我已经使用了很长时间了,但我找不到明确解释它何时不能保证唯一.以下是我的意见,请您认为合适.
保证值在创建它的机器上是唯一的(创建).因此,.net app在计算机上生成的GUID永远不会与SQL Server在同一台计算机上创建的GUID冲突.
在所有其他情况下,无法保证.从理论上讲,如果在不同计算机上的数据库中有唯一标识符字段的多个创建源(比如不同计算机上的应用程序),则总是可能存在重复项.
编辑:道歉没有正确形成问题.我想我想知道在不同机器上生成冲突的可能性,如果使用c#Guid.NewGuid(),SQL Server newid(),newsequentialid()函数或不同应用程序的任何其他函数."已经回答"的链接有一个回复,其中说它实际上遇到了发生这种情况的案例.让你想知道这种情况经常发生的频率.
如果我有一个带有uniqueidentifier字段的表作为pk,我是否应该担心每次通过不同的应用程序或SQL Server的函数创建新值来检查唯一性?
Eri*_*ert 17
我想我想知道在同一台机器上生成冲突的可能性与不同的机器,如果c#
Guid.NewGuid(),SQL Servernewid(),newsequentialid()函数或不同应用程序的任何其他功能
这是一个不可思议的广泛问题."在不同的应用程序中的任何其他功能"不是我们可以推理的东西.
相反,让我们问一个可回答的问题,然后回答它.
生成GUID的不同机制有哪些?
第一版GUID组合了当前机器的MAC地址,当前时间以及一些特定于实现的原点.因此它们在时间和空间上是独一无二的.
版本3和五个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明显小于2 61,它就非常小.