GUID是100%独一无二的吗?

Dav*_*rab 490 language-agnostic guid

GUID是100%独一无二的吗?

它会在多个线程中保持独特吗?

Ada*_*vis 408

虽然不保证每个生成的GUID是唯一的,但是唯一密钥的总数(2 128或3.4×10 38)是如此之大,以至于两次生成相同数字的概率非常小.例如,考虑可观察的宇宙,其中包含大约5×10 22个 星; 然后,每颗星都可以拥有6.8×10 15个通用唯一的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/

​​

  • 那他们不会被称为UUID吗?;) (113认同)
  • 如果你像我一样,那么你会想知道写出的'2 ^ 128`大约是:`34,028,236,692,093,846,346,337,460,743,177,000,000`.从统计上来说,如果您每秒计算1000个GUID,则仍需要数万亿年才能获得重复. (63认同)
  • 从技术上讲,它不是2 ^ 128,因为在v4 GUID中,你有一个十六进制数字,总是4(有效地删除4位),并且还保留了两个位.但是,2 ^ 122个有效的V4 GUID仍然留下大约5x10 ^ 36,这对我来说也是如此.还有你.每颗星都要接受大约1.1x10 ^ 14个GUID. (38认同)
  • GUID是微软特定的UUID标准实现.所以,两者都是.全球唯一ID与通用唯一ID. (25认同)
  • 我只是觉得它有趣的读出来所以这里有乐趣的家伙:)三十四十亿二十八十亿二百三十六十亿六十九十二十亿九十三septillion八百四十六sextillion三百四十六quintillion三百三十七千万亿四十六亿七千四百三十三亿七千七百万 (20认同)
  • @TheAdamGaskins,如果你像我一样,你会注意到它几乎完全精确,并且想知道它是完全正确的:`340,282,366,920,938,463,463,374,607,431,768,211,456`(并且你会注意到你的力量是10数字 - 它是~340十亿分之一,而不是~34十亿分之一) (4认同)
  • 我认为只是说有很多可能的GUID只是答案的一部分.您还需要知道如何计算GUID.例如,如果你只需要100个唯一的整数(而不是GUID),你的方法就像'if(IsItASunnyDay)然后返回1,否则返回2',你会实际上只有两个唯一的整数... (4认同)
  • @adam davis,你说:`唯一键的总数(2 ^ 128或3.4×10 ^ 38)是如此之大,以至于两次生成相同数字的概率非常小.这并不意味着它不能复制.例如:实数是无穷大的,但是生成实数的1个函数并不意味着它不能生成重复的实数 (2认同)

Bur*_*dar 71

如果你害怕相同的GUID值,那么将它们中的两个放在一起.

Guid.NewGuid().ToString() + Guid.NewGuid().ToString();
Run Code Online (Sandbox Code Playgroud)

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

  • 你必须非常,非常,非常非常偏执地追加3个GUID. (51认同)
  • 仍然不是100%独特(只是为了迂腐). (26认同)
  • @Suamere我创建了一个用于计算偏执级别的网站https://jogge.github.io/HowParanoidAmI/ (21认同)
  • @harsimranb不...非常,非常,非常非常偏执是6个GUID.偏执狂是一个附加,非常偏执是两个附加,等等. (20认同)
  • @Jogge 在我说我是 10,000 级偏执狂之后,你的网站崩溃了。现在我更加偏执了 (8认同)
  • 这一定是我一段时间以来看到的最好的答案之一+1:-) (5认同)
  • @Jogge xD太神奇了,大声笑。在您的表格中使用9 9的“ 999999999”后,我认为偏执狂会冒用我的浏览器。 (2认同)
  • @Jogge Ha,占位符是数字 42 :)。 (2认同)

ljs*_*ljs 62

简单的答案是肯定的.

Raymond Chen撰写了一篇关于GUID 的精彩文章,以及为什么GUID的子串不能保证唯一.本文深入探讨了GUID的生成方式以及它们用于确保唯一性的数据,这应该在解释它们为什么的时候会有一定的篇幅:-)

  • 我认为Chen的文章指的是GUID生成算法的V1,它使用MAC地址和时间戳 - 当前的V4使用伪随机数代替:http://en.wikipedia.org/wiki/Globally_Unique_Identifier#Algorithm (22认同)
  • 链接已消失-禁止使用403 (2认同)

Jon*_*lle 36

作为旁注,我正在玩Windows XP中的Volume 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
Run Code Online (Sandbox Code Playgroud)

这并不是GUID非常相似,而是所有GUID都包含字符串"mario"的事实.这是巧合,还是有背后的解释?

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

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

  • 还记得80年代的超级马里奥兄弟3广告吗?所有那些人大喊"马里奥!马里奥!马里奥!" 世界各地都对宇宙的随机性有点不满. (30认同)
  • 如果使用`msiexec`手动卸载Office 2010,它将列出office程序的所有MSI GUID.他们都拼写'0FF1CE`.好像微软有一个相当......松散...解释如何生成GUID;) (24认同)
  • 我知道,任天堂安全管理局已经破坏了随机数生成器. (16认同)
  • 这些分区GUID都是在2009-12-17 @ 2:47:45 UTC时共同创建的.它们对您的机器来说是独一无二的,但将"mario"作为节点标识符是不正确的 - 这意味着它们不符合RFC-4122标准.同样,`0FF1CE` GUID属于RFC-4122的"NCS向后兼容性"部分,但Microsoft不太可能遵循这些值的NCS规则. (3认同)
  • 也许这与生产矿泉水的公司(听说他们引领市场)依云(Evian)的名字是一样的。向后拼写则表示 Naive :-) (2认同)
  • 这些是“Type 1 UUID” - 您可以从 **11de** 中的 **1** 看出。UUID的固定6字节是生成UUID的机器的节点(即MAC地址)。在这种情况下,MAC 地址是 **`80-6d-61-72-69-6f`**。您会注意到高位已设置;这意味着它不是真正的 MAC 地址;[而是伪随机生成的 MAC 地址](https://devblogs.microsoft.com/oldnewthing/20191120-00/?p=103118) (2认同)

Eri*_*ard 28

是的,GUID应始终是唯一的.它基于硬件和时间,加上一些额外的位,以确保它是独一无二的.我确信理论上可能最终得到两个相同的,但在现实场景中极不可能.

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

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

  • 这篇文章相当古老,指的是GUID的v1.v4不使用硬件/时间而是使用随机数算法.https://en.wikipedia.org/wiki/Globally_unique_identifier#Algorithm (4认同)

小智 26

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

  • `Guid.NewGuid`总是生成v4 GUID(并且总是有).蒂姆必须有极差的熵来源. (12认同)
  • 这仅适用于使用MAC地址(非机器名)作为GUID生成一部分的v1 guids.v4,事实上的STD不再使用Mac地址,而是伪随机数. (7认同)
  • @StephanBaltzer不,[这根本不可能](http://ralphbecket.blogspot.com/2011/09/birthday-paradox-and-guid-collisions.html)。如果这确实发生在您身上,则说明您的代码中存在错误,例如截断 GUID 或混淆数据行。事实上,“NewGuid”实现*中更有可能存在错误,而不是您真正观察到的没有错误的碰撞。但到目前为止,尚未报告此类错误,因此我敢打赌,该问题出在您的代码中。 (3认同)
  • 有没有被复制过?如果是这样,那将是一个巨大的问题。 (2认同)
  • 导入非常大的数据集时也是如此。从大约 10-1 亿,您会从 Guid.NewGuid 获得重复项 (2认同)

Rob*_*ker 21

Guids在统计上是独一无二的.生成相同Guid的两个不同客户端的几率是无限小的(假设Guid生成代码中没有错误).您可能还担心由于宇宙射线造成的处理器故障,并且今天决定2 + 2 = 5.

分配新guid的多个线程将获得唯一值,但是你应该得到你正在调用的函数是线程安全的.这是哪个环境?


Mic*_*ren 16

从理论上讲,不,它们并不是唯一的.可以一遍又一遍地生成相同的guid.然而,它发生的可能性非常低,你可以认为它们是独一无二的.

我之前已经读过,机会很低,你真的应该强调别的东西 - 比如你的服务器自发地燃烧或你的代码中的其他错误.也就是说,假设它是唯一的,并且不构建任何代码来"捕获"重复项 - 将时间花在更可能发生的事情上(即其他任何事情).

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

  • 1比2 ^ 128
  • 340万分之一(不要担心,十亿不在测验中)
  • 1乘3.4×10 ^ 38
  • 1 340,000,000,000,000,000,000,000,000,000,000,000,000,000,000

  • 实际上,我不同意“不用担心”,尽管立场不同:如果您确实检测到 GUID 冲突,则说明您的应用程序出了问题。例如,我已经将 GUID 用于幂等性,并且当一个命令被发送两次(使用相同的 GUID)时发生了冲突。 (3认同)

Pao*_*tti 16

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

世界上有2 30台个人计算机(当然还有许多手持设备或非PC计算设备具有或多或少相同的计算能力,但让我们忽略它们).让我们假设我们将世界上所有这些PC都用于生成GUID的任务; 如果每个人每秒可以产生2 20个 GUID,那么仅仅大约2 72秒 - 一百五十万亿年 - 你将很有可能与你的特定GUID产生碰撞.仅仅三十万亿年后碰撞的几率就相当不错了.

  • ...并继续下一段:*"但是那正在寻找与特定GUID的冲突.[...]因此,如果我们让那些十亿台PC工作,产生122位随机性GUID,那么在生成大约2 ^ 61个GUID之后,其中两个位置会发生冲突会变得非常高.因为我们假设大约有2 ^ 30台机器每秒执行2 ^ 20个GUID,**我们预计会发生冲突大约2 ^ 11秒,大约一个小时**."*(最后他解释说,当然,并没有生成那么多的GUID.) (24认同)

Cin*_*ine 9

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

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

我们知道在n选秀中没有获得重复的一般概率是:

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

因为2 128远远大于n,我们可以将其近似为:

(1-1/2 128)n(n-1)/ 2

因为我们可以假设n比0大得多,我们可以将其近似为:

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

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

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

我们解决的问题是n:

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

哪个Wolfram Alpha变为5.598318×10 19

为了对这个数字进行透视,我们可以使用10000台机器,每台机器都有4核CPU,执行4Ghz并花费10000个周期来生成Guid而不执行任何其他操作.然后它们需要大约111年才会产生重复.

  • @GeorgeK 我认为你误解了...... 10000 台机器需要 111 年才有 1% 的机会遇到重复。但是,是的,这个数学当然假设随机生成器是完全随机的。 (3认同)

Jak*_*urc 7

微软软件定义网

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


Ton*_*Nam 7

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

什么是GUID?

GUID(或UUID)是"全球唯一标识符"(或"通用唯一标识符")的首字母缩写.它是一个128位整数,用于标识资源.术语GUID通常由使用Microsoft技术的开发人员使用,而UUID在其他任何地方使用.

GUID的独特之处是什么?

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

  • 是否有50%的可能性重复高到足以引起恐惧? (6认同)
  • @disklosr 是的,如果您的系统每秒生成 10 亿个 GUID,就足以引起恐惧。在极不可能发生的情况下,您将生成该数量,然后将两个 GUID 链接在一起...... (5认同)

Kon*_*lph 6

GUID 是否 100% 都是唯一的?

不能保证,因为有多种方法可以生成一种。但是,您可以尝试计算创建两个的GUID是相同的机会,你的想法:一个GUID有128位,因此,有2点128不同的GUID -不止有星星在已知的宇宙。阅读维基百科文章了解更多详情。


DrP*_*zza 5

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

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

在实践中,违反规则的人数很少,他们的 GUID 不太可能“逃脱”。冲突在统计上是不可能的。

  • 这仅适用于 v1 guid。v4 是事实上的 STD,不再使用 Mac 地址,而是使用伪随机数。 (12认同)

小智 5

我遇到了重复的GUID。

我使用的是Neat Receipts台式扫描仪,它带有专有的数据库软件。该软件具有“同步到云”功能,并且在同步时一直出现错误。日志上的秃鹰露出了那条令人敬畏的台词:

“错误”:[{“代码”:1,“消息”:“ creator_guid:已被使用”,“ guid”:“ C83E5734-D77A-4B09-B8C1-9623CAC7B167”}]}}

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

因此,以传闻证据回答您的问题,不是。可以重复。但是,发生这种情况的原因很可能不是偶然的,而是由于没有遵循某种标准惯例。(我不是那么幸运)但是,我不能肯定地说。这不是我的软件。

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

  • 不相信你有重复。可能还涉及其他方面,例如数字不是真正随机的,也不是同步过程中的问题,或者系统尝试记录两次,等等。软件问题比获得重复的GUID更有可能。 (19认同)