GUID 是否 100% 都是唯一的?

它会在多个线程中保持唯一吗?

有帮助吗?

解决方案

虽然不能保证每个生成的GUID是唯一的,但唯一键的总数(2128 或3.4×1038)是如此之大,以至于产生相同数字两次的概率很小。例如,考虑可观察到的宇宙,其中包含约5×1022星星;然后,每个星星都可以有6.8×1015 通用唯一的 GUID。

维基百科.


这些是一些关于如何创建 GUID(针对 .NET)以及如何在正确的情况下获得相同 GUID 的好文章。

https://ericlippert.com/2012/04/24/guid-guide-part-one/

https://ericlippert.com/2012/04/30/guid-guide-part-two/

https://ericlippert.com/2012/05/07/guid-guide-part- Three/

​​

其他提示

简单的答案是肯定的。

雷蒙德陈写了一篇 很棒的文章 关于 GUID 以及为什么 GUID 的子字符串是 不是 保证独一无二。本文深入探讨了 GUID 的生成方式以及用于确保唯一性的数据,应该用一定的篇幅来解释 为什么 他们是 :-)

如果您害怕相同的 GUID 值,请将其中两个并排放置。

Guid.NewGuid().ToString() + Guid.NewGuid().ToString();

如果你太偏执,那就放三个。

顺便说一句,我在 Windows XP 中尝试使用卷 GUID。这是一个非常模糊的分区布局,包含三个磁盘和十四个卷。

\\?\Volume{23005604-eb1b-11de-85ba-806d6172696f}\ (F:)
\\?\Volume{23005605-eb1b-11de-85ba-806d6172696f}\ (G:)
\\?\Volume{23005606-eb1b-11de-85ba-806d6172696f}\ (H:)
\\?\Volume{23005607-eb1b-11de-85ba-806d6172696f}\ (J:)
\\?\Volume{23005608-eb1b-11de-85ba-806d6172696f}\ (D:)
\\?\Volume{23005609-eb1b-11de-85ba-806d6172696f}\ (P:)
\\?\Volume{2300560b-eb1b-11de-85ba-806d6172696f}\ (K:)
\\?\Volume{2300560c-eb1b-11de-85ba-806d6172696f}\ (L:)
\\?\Volume{2300560d-eb1b-11de-85ba-806d6172696f}\ (M:)
\\?\Volume{2300560e-eb1b-11de-85ba-806d6172696f}\ (N:)
\\?\Volume{2300560f-eb1b-11de-85ba-806d6172696f}\ (O:)
\\?\Volume{23005610-eb1b-11de-85ba-806d6172696f}\ (E:)
\\?\Volume{23005611-eb1b-11de-85ba-806d6172696f}\ (R:)
                                     | | | | |
                                     | | | | +-- 6f = o
                                     | | | +---- 69 = i
                                     | | +------ 72 = r
                                     | +-------- 61 = a
                                     +---------- 6d = m

这并不是说 GUID 非常相似,而是所有 GUID 中都包含字符串“mario”。这是巧合还是背后有解释?

现在,当 谷歌搜索第 4 部分 在 GUID 中,我发现大约 125.000 个带有卷 GUID 的点击。

结论: 当涉及到卷 GUID 时,它们并不像其他 GUID 那样独特。

是的,GUID 应该始终是唯一的。它基于硬件和时间,加上一些额外的位以确保它是唯一的。我确信理论上有可能得到两个相同的结果,但在现实世界中这是极不可能的。

这是 Raymond Chen 关于 Guids 的精彩文章:

https://blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx ​ ​ ​

它不应该发生。但是,当 .NET 负载较重时,可能会出现重复的 guid。我有两个不同的 Web 服务器,使用两个不同的 SQL 服务器。我去合并数据,发现我有 1500 万个 guid 和 7 个重复项。

指南在统计上是唯一的。两个不同的客户端生成相同 Guid 的几率非常小(假设 Guid 生成代码中没有错误)。您可能还担心您的处理器因宇宙射线而出现故障,并今天决定 2+2=5。

分配新 guid 的多个线程将获得唯一的值,但您应该知道您正在调用的函数是线程安全的。这是在什么环境下?

Eric Lippert 撰写了一系列关于 GUID 的非常有趣的文章。

订单上有230 世界上的个人计算机(当然,许多手持设备或非PC计算设备或多或少具有相同级别的计算能力,但可以忽略这些设备)。假设我们将世界上所有这些PC都放在生成GUID的任务中;如果每个人都可以生成 2 个20 GUID每秒仅2之后72 秒—— 一百五十万年 ——你将会有一个 很高 与您的特定GUID发生碰撞的机会。经过三十万亿年,碰撞的几率变得相当不错。

从理论上讲,不,它们并不独特。可以一遍又一遍地生成相同的指南。然而,这种情况发生的可能性非常低,您可以假设它们是独一无二的。

我之前读过,这种可能性是如此之低,以至于你真的应该强调其他事情——比如你的服务器自发燃烧或代码中的其他错误。也就是说,假设它是唯一的,并且不构建任何代码来“捕获”重复项 - 将时间花在更有可能发生的事情上(即 任何事物 别的)。

做了尝试 向我的博客受众(非技术家庭成员)描述 GUID 的有用性。从那里(通过维基百科),生成重复 GUID 的几率:

  • 1 分 2^128
  • 340千万中的1分之一(别担心,未确定的测验都没有)
  • 1 英寸 3.4 × 10^38
  • 340,000,000,000,000,000,000,000,000,000,000,000,000 中的 1

似乎没有人提到它发生的概率的实际数学。

首先,假设我们可以使用整个 128 位空间(Guid v4 仅使用 122 位)。

我们知道,没有得到重复的一般概率 n 选择是:

(1-1/2128)(1-2/2128)...(1-(n-1)/2128)

因为 2128n, ,我们可以将其近似为:

(1-1/2128)n(n-1)/2

因为我们可以假设 n 远大于 0,我们可以将其近似为:

(1-1/2128)n^2/2

现在我们可以将其等同于“可接受”的概率,假设为 1%:

(1-1/2128)n^2/2 = 0.01

我们解决的问题 n 并得到:

n = sqrt(2* log 0.01 / log (1-1/2128))

Wolfram Alpha 将会成为哪个 5.598318 × 1019

为了更好地理解这个数字,我们假设有 10000 台机器,每台机器都有 4 核 CPU,运行 4Ghz,并花费 10000 个周期来生成 Guid,并且不执行任何其他操作。他们大约需要 111 年才能生成一个副本。

http://www.guidgenerator.com/online-guid-generator.aspx

什么是 GUID?

GUID(或 UUID)是“全局唯一标识符”(或“通用唯一标识符”)的缩写。它是一个128位整数,用于标识资源。术语 GUID 通常由使用 Microsoft 技术的开发人员使用,而 UUID 在其他地方都使用。

GUID 有多独特?

128 位足够大,并且生成算法足够独特,如果一年内每秒生成 1,000,000,000 个 GUID,则重复的概率仅为 50%。或者,如果地球上的每个人生成 600,000,000 个 GUID,则重复的概率只有 50%。

微软软件定义网络:

新 Guid 的值全为零或等于任何其他 Guid 的可能性非常低。

如果您的系统时钟设置正确并且没有绕回,并且您的 NIC 有自己的 MAC(即您还没有设置自定义 MAC)并且您的 NIC 供应商尚未回收 MAC(他们不应该这样做,但已知会发生这种情况),并且如果您的系统的 GUID 生成功能正确实现,那么您的系统将永远不要生成重复的 GUID。

如果地球上生成 GUID 的每个人都遵循这些规则,那么您的 GUID 将是全球唯一的。

实际上,违反规则的人很少,他们的 GUID 也不太可能“逃脱”。从统计上看,冲突是不可能发生的。

我遇到了重复的 GUID。

我使用 Neat Receipts 桌面扫描仪,它配备了专有的数据库软件。该软件具有同步到云的功能,我在同步时不断收到错误。浏览日志发现了令人敬畏的一行:

“错误”:[{“代码”:1,“消息”:“creator_guid:已被捕获为“,” GUID”:“ C83E5734-D77A-4B09-B8C1-9623CAC7B167”}]}}}

我有点难以置信,但可以肯定的是,当我找到一种方法进入我的本地neateworks数据库并删除包含该GUID的记录时,错误就不再发生了。

因此,用轶事证据来回答你的问题,答案是否定的。可以复制。但这种情况发生的原因很可能不是偶然,而是由于未以某种方式遵守标准做法。(我只是没那么幸运)但是,我不能肯定地说。这不是我的软件。

他们的客户支持非常有礼貌和乐于助人,但他们以前一定从未遇到过这个问题,因为在与他们通了 3 个多小时的电话后,他们没有找到解决方案。(FWIW,Neat 给我留下了深刻的印象,这个小故障,无论多么令人沮丧,都没有改变我对他们产品的看法。)

GUID 是否 100% 都是唯一的?

不能保证,因为有多种生成方法。但是,您可以尝试计算创建两个相同的 GUID 的机会,您就会明白:GUID 有 128 位,因此有 2128 不同的 GUID – 很多 比已知宇宙中的恒星还要多。阅读 维基百科文章 更多细节。

GUID算法通常根据v4 GUID规范来实现,它本质上是一个伪随机字符串。可悲的是,这些属于 “可能不是唯一的”, ,来自维基百科(我不知道为什么这么多人忽略这一点):“……其他 GUID 版本具有不同的唯一性属性和概率,范围从保证唯一性到可能非唯一性。”

V8 JavaScript 的伪随机特性 Math.random() 其唯一性非常糟糕,仅仅几千次迭代后经常会发生冲突,但 V8 并不是唯一的罪魁祸首。我见过使用 v4 GUID 的 PHP 和 Ruby 实现的真实 GUID 冲突。

由于跨多个客户端和服务器集群扩展 ID 生成变得越来越普遍,因此熵受到了很大的打击——使用相同的随机种子生成 ID 的机会不断增加(时间通常用作随机种子)在伪随机生成器中),GUID 冲突从“可能非唯一”升级为“很可能造成很多麻烦”。

为了解决这个问题,我着手创建一种可以安全扩展的 ID 算法,并更好地保证防止碰撞。它通过使用时间戳、内存中客户端计数器、客户端指纹和随机字符来实现这一点。这些因素的组合会产生一种附加的复杂性,即使您将其扩展到多个主机上,该复杂性也特别能抵抗碰撞:

http://usecuid.org/

我在多线程/多进程单元测试期间经历过 GUID 不是唯一的(也是?)。我想这与所有其他条件相同、伪随机生成器的相同播种(或缺乏播种)有关。我用它来生成唯一的文件名。我发现操作系统在这方面做得更好:)

恶搞警报

您询问 GUID 是否 100% 唯一。这取决于它在其中必须是唯一的 GUID 的数量。随着 GUID 的数量接近无穷大,重复 GUID 的概率接近 100%。

从更一般的意义上来说,这被称为“生日问题”或“生日悖论”。维基百科有一个很好的概述:维基百科 - 生日问题

粗略地说,池大小的平方根是您预计出现重复的概率为 50% 的粗略近似值。该文章包括池大小和各种概率的概率表,其中包括 2^128 的一行。因此,对于 1% 的碰撞概率,您会期望随机选择 2.6*10^18 128 位数字。50% 的机会需要 2.2*10^19 次选秀,而 SQRT(2^128) 是 1.8*10^19。

当然,这只是真正随机过程的理想情况。正如其他人提到的,很多事情都取决于这一点 随机的 方面 - 生成器和种子到底有多好?如果有一些硬件支持来协助这个过程,那就太好了,除了任何东西都可以被欺骗或虚拟化之外,这将更加防弹。我怀疑这可能是 MAC 地址/时间戳不再合并的原因。

的答案 “GUID 是否 100% 唯一?” 简直就是 “不” .

  • 如果您想要 GUID 100% 唯一性,请执行以下操作。

    1. 生成GUID
    2. 检查该 GUID 是否存在于您要查找唯一性的表列中
    3. 如果存在则转到步骤 1,否则转到步骤 4
    4. 使用此 GUID 作为唯一的。

最难的部分不是生成重复的 Guid。

最难的部分是设计一个数据库来存储所有生成的数据,以检查它是否确实重复。

来自维基:

例如,为了有 50% 的概率发生至少一次冲突,需要生成的随机版本 4 UUID 的数量为 2.71 quintillion,计算如下:

在此输入图像描述

这个数字相当于在大约 85 年里每秒生成 10 亿个 UUID,而包含这么多 UUID 的文件(每个 UUID 16 字节)将约为 45 艾字节,比目前存在的最大数据库大很多倍。数百 PB 量级

GUID 代表全球唯一标识符

简单来说:(线索就在名字里)

详细地:GUID 被设计为唯一的;它们是使用基于计算机时钟和计算机​​本身的随机方法计算的,如果您在同一台计算机上同一毫秒创建许多 GUID,它们可能会匹配,但对于几乎所有正常操作,它们应被视为唯一。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top