GUID 100%是唯一的吗?
它会在多个线程中保持唯一吗?
GUID 100%是唯一的吗?
它会在多个线程中保持唯一吗?
当前回答
GUID 100%是唯一的吗?
不能保证,因为有几种方法可以生成一个。然而,您可以尝试计算创建两个完全相同的GUID的几率,您就会明白:一个GUID有128位,因此,有2128个不同的GUID——比已知宇宙中的恒星要多得多。阅读维基百科的文章了解更多细节。
其他回答
似乎没有人提到它发生概率的实际数学计算。
首先,让我们假设我们可以使用整个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 = 0.01
我们解出n,得到
N =√(2* log 0.01 / log (1-1/2128))
哪个Wolfram Alpha得到5.598318 × 1019
为了更好地理解这个数字,让我们以10000台机器为例,每台机器都有一个4核CPU,工作4Ghz,花费10000个周期来生成一个Guid,其他什么都不做。然后需要大约111年才能产生一个副本。
在多线程/多进程单元测试期间,我经历过guid不是唯一的(也是?)我想这与所有其他条件相同的情况下,伪随机生成器的相同播种(或缺乏播种)有关。我用它来生成唯一的文件名。我发现操作系统在这方面做得更好:)
恶意破坏预警
你问guid是否100%唯一。这取决于它在guid中必须是唯一的。当guid的数量接近无穷大时,重复guid的概率接近100%。
“GUID是100%唯一的吗?”的答案是“不是”。
如果你想要GUID的100%唯一性,然后做下面的事情。 生成GUID 检查GUID是否存在于您正在寻找唯一性的表列中 如果存在,则转步骤1,否则转步骤4 使用这个GUID作为唯一的。
在更广泛的意义上,这被称为“生日问题”或“生日悖论”。维基百科有一个很好的概述: 维基百科-生日问题
粗略地说,池大小的平方根是一个粗略的近似值,即您可以期望有50%的重复机会。这篇文章包含了一个关于池大小和各种概率的概率表,包括2^128的一行。所以对于1%的碰撞概率,你可以随机选择2.6*10^18个128位数字。50%的概率需要2.2*10^19次选择,而根号(2^128)是1.8*10^19次选择。
当然,这只是一个真正随机过程的理想情况。正如其他人所提到的,很多事情都取决于随机方面——生成器和种子有多好?如果有一些硬件支持来帮助这个过程,那就太好了,这将更加防弹,除非任何东西都可能被欺骗或虚拟化。我怀疑这可能是MAC地址/时间戳不再被合并的原因。
如果你害怕相同的GUID值,那么把它们放在一起。
Guid.NewGuid().ToString() + Guid.NewGuid().ToString();
如果你太多疑,那就放三个。