哪种生成 GUID 的方法最适合确保 GUID 真正唯一?
Posted
技术标签:
【中文标题】哪种生成 GUID 的方法最适合确保 GUID 真正唯一?【英文标题】:Which method for generating GUID's is best for ensuring the GUID is really unique? 【发布时间】:2013-08-30 14:28:08 【问题描述】:我已经使用了很长时间,但是我无法找到关于何时不能保证唯一的明确解释。这是我的cmets,如果你认为合适,请更正。
保证值在创建它的机器上是唯一的(已创建)。因此,一台机器上的 .net 应用程序生成的 GUID 永远不会与同一台机器上的 SQL Server 创建的 GUID 冲突。
在所有其他情况下,我们无法保证。从理论上讲,如果不同计算机上的数据库中的唯一标识符字段有多个创建源(例如不同计算机上的应用程序),则总是有可能插入重复项。
编辑:抱歉没有正确地提出问题。我想我想知道在同一台机器上与不同机器上生成冲突的概率,如果使用 c# 的 Guid.NewGuid()
、SQL Server 的 newid()
、newsequentialid()
函数或不同应用程序的任何其他函数。 “已回答”链接有一个回复,其中说他实际上遇到了发生这种情况的案例。让你想知道这种情况发生的频率有多高。
如果我有一个带有 uniqueidentifier 字段作为 pk 的表,我是否必须在每次通过不同的应用程序或 SQL Server 的函数创建一个新值进行插入时检查唯一性?
【问题讨论】:
您应该阅读 Eric Lippert 的 GUID 指南 系列:blogs.msdn.com/b/ericlippert/archive/tags/guids 或至少 RFC - apps.ietf.org/rfc/rfc4122.html 我很确定您不是在询问uniqueidentifier
数据类型。您可能会询问newid
函数,或者newsequentialid
函数。这两个函数的答案是完全不同的,如果你的意思是别的,可能也不同。
【参考方案1】:
我想我想知道在同一台机器上与不同机器上生成冲突的概率,如果 c# 的
Guid.NewGuid()
、SQL Server 的newid()
、newsequentialid()
函数或不同应用程序的任何其他函数
这是一个非常广泛的问题。 “不同应用程序中的任何其他功能”不是我们可以推理的。
让我们提出一个可以回答的问题,然后回答它。
生成 GUID 的不同机制有哪些?
版本 1 GUID 结合了当前机器的 MAC 地址、当前时间和更多特定于实现的来源的位。因此,它们在时间和空间上都是独一无二的。
第三版和第五版 GUID 使用唯一字符串的加密强度哈希。它们的冲突概率基于哈希冲突的概率。
第四版 GUID 使用伪随机数生成器。它们的碰撞概率基于 PRNG 产生碰撞的概率。
假设机器具有唯一的 MAC 地址,在两台不同的机器上发生版本 1 GUID 冲突的概率是多少?
零。
当在同一台物理机上运行两个虚拟机并在每个虚拟机上生成 GUID 时,版本 1 GUID 冲突的概率是多少?
高;如果 GUID 是在同一时间片中生成的,那么它们很可能发生冲突。
如果这样做会痛,请不要这样做。
其余的 GUID 算法不依赖于机器的细节。
假设源字符串是唯一的,那么版本 3 或 5 GUID 与另一个版本冲突的概率是多少?
该概率与版本 4 GUID 冲突的概率大致相同,所以让我们考虑一下。
第四版 GUID 冲突的概率是多少?
给定的 v4 GUID 与一组 n 个唯一 v4 GUID 中的任何 v4 GUID 发生冲突的概率为 n 除以 2122.
给定一组 n v4 GUID 将包含至少一个冲突的概率很难表达,但只要 n 明显小于261.
【讨论】:
@OP:根据 Stephen Cleary (A Few Words on GUIDs),SQL 顺序 guid 不符合 RFC。 Stephen 指出(在“数据库问题”部分)他们与其他(符合 RFC 标准的)guid 发生冲突的可能性增加了。 我似乎记得 some guy 不久前写过一个关于 GUID 的系列文章。 :) 当 n 小于 2^61 时,n²/2n¹²² 应该是“给定一组 n 个 v4 GUID 将包含至少一个冲突的概率”的合理近似值。以上是关于哪种生成 GUID 的方法最适合确保 GUID 真正唯一?的主要内容,如果未能解决你的问题,请参考以下文章