GUID是100%独一无二的吗?
它会在多个线程中保持独特吗?
虽然不保证每个生成的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/
如果你害怕相同的GUID值,那么将它们中的两个放在一起.
Guid.NewGuid().ToString() + Guid.NewGuid().ToString();
如果你太偏执,那就放三个.
简单的答案是肯定的.
Raymond Chen撰写了一篇关于GUID 的精彩文章,以及为什么GUID的子串不能保证唯一.本文深入探讨了GUID的生成方式以及它们用于确保唯一性的数据,这应该在解释它们为什么的时候会有一定的篇幅:-)
作为旁注,我正在玩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
这并不是GUID非常相似,而是所有GUID都包含字符串"mario"的事实.这是巧合,还是有背后的解释?
现在,当在谷歌搜索 GUID中的第4部分时,我发现大约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副本.
Guids在统计上是独一无二的.生成相同Guid的两个不同客户端的几率是无限小的(假设Guid生成代码中没有错误).您可能还担心由于宇宙射线造成的处理器故障,并且今天决定2 + 2 = 5.
分配新guid的多个线程将获得唯一值,但是你应该得到你正在调用的函数是线程安全的.这是哪个环境?
从理论上讲,不,它们并不是唯一的.可以一遍又一遍地生成相同的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
Eric Lippert撰写了一系列关于GUID的非常有趣的文章.
世界上有2 30台个人计算机(当然还有许多手持设备或非PC计算设备具有或多或少相同的计算能力,但让我们忽略它们).让我们假设我们将世界上所有这些PC都用于生成GUID的任务; 如果每个人每秒可以产生2 20个 GUID,那么仅仅大约2 72秒 - 一百五十万亿年 - 你将很有可能与你的特定GUID产生碰撞.仅仅三十万亿年后碰撞的几率就相当不错了.
GUID指南,第一部分
GUID指南,第二部分
GUID指南,第三部分
似乎没有人提到它发生概率的实际数学.
首先,假设我们可以使用整个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年才会产生重复.
来自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%.
我遇到了重复的GUID。
我使用的是Neat Receipts台式扫描仪,它带有专有的数据库软件。该软件具有“同步到云”功能,并且在同步时一直出现错误。日志上的秃鹰露出了那条令人敬畏的台词:
“错误”:[{“代码”:1,“消息”:“ creator_guid:已被使用”,“ guid”:“ C83E5734-D77A-4B09-B8C1-9623CAC7B167”}]}}
我有点难以置信,但是可以肯定的是,当我找到了进入本地neatworks数据库的方法并删除了包含该GUID的记录时,错误停止发生。
因此,以传闻证据回答您的问题,不是。可以重复。但是,发生这种情况的原因很可能不是偶然的,而是由于没有遵循某种标准惯例。(我不是那么幸运)但是,我不能肯定地说。这不是我的软件。
他们的客户支持非常礼貌和乐于助人,但他们一定从来没有遇到过这个问题,因为与他们通电话3个多小时后,他们找不到解决方案。(FWIW,Neat给我留下了很深刻的印象,尽管如此令人沮丧,但这种故障并没有改变我对其产品的看法。)