关于语言不可知:GUID在100%的时间内都是唯一的吗?

Is a GUID unique 100% of the time?

guid是100%唯一的吗?

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


While each generated GUID is not
guaranteed to be unique, the total
number of unique keys (2128 or
3.4×1038) is so large that the probability of the same number being
generated twice is very small. For
example, consider the observable
universe, which contains about 5×1022
stars; every star could then have
6.8×1015 universally unique GUIDs.

来自维基百科。

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

Guid guide, part one

Guid guide, part two

Guid guide, part three

??


简单的答案是肯定的。

陈雷蒙写了一篇关于guid的伟大文章,以及为什么guid的子字符串不能保证是唯一的。本文深入介绍了生成guid的方式以及它们用来确保唯一性的数据,在解释它们为什么是这样的原因时,应该有一定的篇幅:—)


如果您害怕相同的guid值,那么将其中两个值放在一起。

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

如果你太多疑,那就放三个。


作为旁注,我在WindowsXP中玩音量guid。这是一个非常模糊的分区布局,有三个磁盘和十四个卷。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
\\?\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

不是吉他很相似,而是所有的吉他都有一个字符串"Mario"。这是巧合还是背后有解释?

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

结论:当谈到音量吉他时,它们并不像其他吉他那样独特。


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

这是陈瑞蒙关于吉他的一篇很好的文章:

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


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


guid在统计上是唯一的。生成相同guid的两个不同客户机的几率非常小(假设guid生成代码中没有错误)。你也可以担心你的处理器由于宇宙射线而出现故障,并决定今天2+2=5。

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


埃里克·利珀特写了一系列非常有趣的关于guid的文章。

There are on the order 230 personal computers in the world (and of
course lots of hand-held devices or non-PC computing devices that have
more or less the same levels of computing power, but lets ignore
those). Let's assume that we put all those PCs in the world to the
task of generating GUIDs; if each one can generate, say, 220 GUIDs per
second then after only about 272 seconds -- one hundred and fifty
trillion years -- you'll have a very high chance of generating a
collision with your specific GUID. And the odds of collision get
pretty good after only thirty trillion years.

  • 指南,第一部分
  • 指南,第二部分
  • 指南,第三部分


理论上说,它们不是独一无二的。可以反复生成相同的GUID。然而,发生这种情况的可能性很低,你可以假设它们是独一无二的。

我以前读过,这种可能性非常低,以至于你真的应该为其他事情而感到压力——比如服务器自燃或者代码中的其他错误。也就是说,假设它是唯一的,并且不内置任何代码来"捕获"重复项——将您的时间花在更可能发生的事情上(即其他任何事情)。

我试图向我的博客读者(非技术性的家庭成员)描述guid的有用性。从那里(通过维基百科),生成重复guid的几率:

  • 2 ^ 128中的1
  • 1/340不合规(别担心,不合规不在测验)
  • 1英寸3.4×10^38
  • 340000000000000000000000000000000000000中的1个


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

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

我们知道,在n选择中,没有得到副本的一般概率是:

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

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

(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.guid generator.com/online-guid-generator.aspx

What is a GUID?

GUID (or UUID) is an acronym for 'Globally Unique Identifier' (or 'Universally Unique Identifier'). It is a 128-bit integer number used to identify resources. The term GUID is generally used by developers working with Microsoft technologies, while UUID is used everywhere else.

How unique is a GUID?

128-bits is big enough and the generation algorithm is unique enough that if 1,000,000,000 GUIDs per second were generated for 1 year the probability of a duplicate would be only 50%. Or if every human on Earth generated 600,000,000 GUIDs there would only be a 50% probability of a duplicate.


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

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

在实践中,违反规则的人数很少,而且他们的本色不太可能"逃脱"。在统计上,冲突是不可能发生的。


我遇到了一个重复的guid。

我使用整洁的收据桌面扫描仪,它带有专有的数据库软件。这个软件有一个同步到云的功能,我一直在同步时出错。伐木场上的一只大雁发现了一条令人敬畏的线:

"errors":[{"code":1,"message":"creator_guid: is already
taken","guid":"C83E5734-D77A-4B09-B8C1-9623CAC7B167"}]}

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

所以要用轶事证据来回答你的问题,不,可能有副本。但这很可能不是因为偶然,而是因为标准惯例在某种程度上没有得到遵守。(我只是没那么幸运)但是,我不能肯定。这不是我的软件。

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


Is a GUID unique 100% of the time?

不保证,因为有几种方法可以生成一个。但是,您可以尝试计算创建两个相同的guid的机会,您会得到这样的想法:一个guid有128位,因此,有2128个不同的guid——比已知宇宙中的恒星要多得多。阅读维基百科文章了解更多细节。


MSDN:

There is a very low probability that the value of the new Guid is all zeroes or equal to any other Guid.


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

V8的javascript Math.random()的伪随机属性在唯一性上很糟糕,只有几千次迭代之后才会发生冲突,但V8并不是唯一的罪魁祸首。我已经看到了使用v4 guid的php和ruby实现的真实的guid冲突。

因为在多个客户机和服务器集群中扩展ID生成越来越常见,熵受到了很大的冲击——相同的随机种子被用于生成ID升级(在伪随机生成器中,时间通常被用作随机种子)的机会,并且GUID冲突从"可能不唯一"升级到"非常小"凯莉会引起很多麻烦的。

为了解决这个问题,我开始创建一个能够安全伸缩的ID算法,并对碰撞做出更好的保证。它通过使用时间戳、内存中的客户机计数器、客户机指纹和随机字符来实现这一点。这些因素的组合会产生一种额外的复杂性,这种复杂性尤其能够抵抗碰撞,即使您在多个主机上对其进行缩放:

网址:http://usecuid.org/


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

拖曳警报

你会问guid是否100%唯一。这取决于guid的数量,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代表全局唯一标识符

简言之:(线索在名字里)

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


回答"guid是否100%唯一?"只是"不"。

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

  • 生成GUID
  • 检查您要查找uniquencess的表列中是否存在该guid
  • 如果存在,则转到步骤1,否则转到步骤4
  • 将此GUID用作唯一的。

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

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

来自维基:

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

在此处输入图像描述

这个数字相当于在大约85年内每秒生成10亿个uuid,而一个包含这许多uuid的文件(每个uuid为16个字节)大约为45 exabytes,比目前存在的最大的数据库大很多倍,这个数据库大约有数百个petabytes。