5

我已经使用它很长时间了,但我无法找到关于何时不能保证唯一的明确解释。以下是我的评论,如果您认为合适,请更正。

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

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

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

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

4

1 回答 1

17

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

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

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

生成 GUID 的不同机制是什么?

第一版 GUID 结合了当前机器的 MAC 地址、当前时间和更多特定于实现的来源。因此,它们在时间和空间上都是独一无二的。

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

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

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

零。

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

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

如果这样做时会感到疼痛,请不要这样做。

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

鉴于源字符串是唯一的,版本 3 或 5 GUID 与另一个版本冲突的概率是多少?

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

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

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

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

于 2013-08-28T00:39:05.197 回答