当前位置:  开发笔记 > 编程语言 > 正文

GUID是100%独一无二的吗?

如何解决《GUID是100%独一无二的吗?》经验,为你挑选了12个好方法。

GUID是100%独一无二的吗?

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



1> Adam Davis..:

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

2> Bura Chuhada..:

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

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

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


你必须非常,非常,非常非常偏执地追加3个GUID.
仍然不是100%独特(只是为了迂腐).
@Suamere我创建了一个用于计算偏执级别的网站https://jogge.github.io/HowParanoidAmI/
@harsimranb不...非常,非常,非常非常偏执是6个GUID.偏执狂是一个附加,非常偏执是两个附加,等等.
@Jogge xD太神奇了,大声笑。在您的表格中使用9 9的“ 999999999”后,我认为偏执狂会冒用我的浏览器。

3> ljs..:

简单的答案是肯定的.

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


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

4> Jonas Gulle..:

作为旁注,我正在玩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那样独特.


还记得80年代的超级马里奥兄弟3广告吗?所有那些人大喊"马里奥!马里奥!马里奥!" 世界各地都对宇宙的随机性有点不满.
如果使用`msiexec`手动卸载Office 2010,它将列出office程序的所有MSI GUID.他们都拼写'0FF1CE`.好像微软有一个相当......松散...解释如何生成GUID;)
我知道,任天堂安全管理局已经破坏了随机数生成器.
这些分区GUID都是在2009-12-17 @ 2:47:45 UTC时共同创建的.它们对您的机器来说是独一无二的,但将"mario"作为节点标识符是不正确的 - 这意味着它们不符合RFC-4122标准.同样,`0FF1CE` GUID属于RFC-4122的"NCS向后兼容性"部分,但Microsoft不太可能遵循这些值的NCS规则.

5> Eric Z Beard..:

是的,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

6> 小智..:

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


`Guid.NewGuid`总是生成v4 GUID(并且总是有).蒂姆必须有极差的熵来源.
这仅适用于使用MAC地址(非机器名)作为GUID生成一部分的v1 guids.v4,事实上的STD不再使用Mac地址,而是伪随机数.

7> Rob Walker..:

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

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



8> Michael Hare..:

从理论上讲,不,它们并不是唯一的.可以一遍又一遍地生成相同的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



9> Paolo Morett..:

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

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

GUID指南,第一部分

GUID指南,第二部分

GUID指南,第三部分


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

10> Cine..:

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

首先,假设我们可以使用整个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年才会产生重复.



11> Tono Nam..:

来自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%的可能性重复高到足以引起恐惧?

12> 小智..:

我遇到了重复的GUID。

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

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

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

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

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


不相信你有重复。可能还涉及其他方面,例如数字不是真正随机的,也不是同步过程中的问题,或者系统尝试记录两次,等等。软件问题比获得重复的GUID更有可能。
推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有