Is a GUID unique 100% of the time?guid是100%唯一的吗? 它会在多个线程上保持唯一性吗?
来自维基百科。 以下是一些关于如何创建一个guid(对于.NET)以及如何在正确的情况下获得相同的guid的好文章。 Guid guide, part one Guid guide, part two Guid guide, part three ?? 简单的答案是肯定的。 陈雷蒙写了一篇关于guid的伟大文章,以及为什么guid的子字符串不能保证是唯一的。本文深入介绍了生成guid的方式以及它们用来确保唯一性的数据,在解释它们为什么是这样的原因时,应该有一定的篇幅:—) 如果您害怕相同的guid值,那么将其中两个值放在一起。
如果你太多疑,那就放三个。 作为旁注,我在WindowsXP中玩音量guid。这是一个非常模糊的分区布局,有三个磁盘和十四个卷。
不是吉他很相似,而是所有的吉他都有一个字符串"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的文章。
理论上说,它们不是独一无二的。可以反复生成相同的GUID。然而,发生这种情况的可能性很低,你可以假设它们是独一无二的。 我以前读过,这种可能性非常低,以至于你真的应该为其他事情而感到压力——比如服务器自燃或者代码中的其他错误。也就是说,假设它是唯一的,并且不内置任何代码来"捕获"重复项——将您的时间花在更可能发生的事情上(即其他任何事情)。 我试图向我的博客读者(非技术性的家庭成员)描述guid的有用性。从那里(通过维基百科),生成重复guid的几率:
似乎没有人提到它发生的概率的实际数学。 首先,假设我们可以使用整个128位空间(guid v4只使用122位)。 我们知道,在
因为2128比
因为我们可以假设
现在我们可以把它等同于"可接受的"概率,假设1%:
我们对
Wolfram Alpha的值是5.598318×1019 为了透视这个数字,让我们来看看10000台机器,每台机器都有一个4核CPU,执行4GHz,花费10000个周期来生成一个guid,而不执行其他任何操作。然后需要大约111年才能产生一个复制品。 来自http://www.guid generator.com/online-guid-generator.aspx
如果您的系统时钟设置正确且未被包装,并且您的NIC有自己的MAC(即,您没有设置自定义MAC),并且您的NIC供应商没有回收MAC(它们不应该这样做,但已知会发生),并且如果您的系统的GUID生成功能得到了正确实施,那么您的系统将永远不会生成重复的guid。 如果地球上所有生成guid的人都遵循这些规则,那么您的guid将是全球唯一的。 在实践中,违反规则的人数很少,而且他们的本色不太可能"逃脱"。在统计上,冲突是不可能发生的。 我遇到了一个重复的guid。 我使用整洁的收据桌面扫描仪,它带有专有的数据库软件。这个软件有一个同步到云的功能,我一直在同步时出错。伐木场上的一只大雁发现了一条令人敬畏的线:
我有点不相信,但可以肯定的是,当我找到进入本地网络数据库的方法并删除包含该guid的记录时,错误停止了发生。 所以要用轶事证据来回答你的问题,不,可能有副本。但这很可能不是因为偶然,而是因为标准惯例在某种程度上没有得到遵守。(我只是没那么幸运)但是,我不能肯定。这不是我的软件。 他们的客户支持非常有礼貌和帮助,但他们以前一定从未遇到过这个问题,因为在与他们通了3个多小时的电话后,他们没有找到解决方案。(fwiw,我对整洁印象深刻,这个小故障,尽管令人沮丧,没有改变我对他们产品的看法。)
不保证,因为有几种方法可以生成一个。但是,您可以尝试计算创建两个相同的guid的机会,您会得到这样的想法:一个guid有128位,因此,有2128个不同的guid——比已知宇宙中的恒星要多得多。阅读维基百科文章了解更多细节。 MSDN:
guid算法通常是根据v4guid规范实现的,它本质上是一个伪随机字符串。可悲的是,这些都属于维基百科的"可能不独特"类别(我不知道为什么这么多人忽略了这一点):"……其他guid版本具有不同的唯一性属性和概率,从保证的唯一性到可能的不唯一性。" V8的javascript 因为在多个客户机和服务器集群中扩展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。 最困难的部分是设计一个数据库来存储所有生成的数据库,以检查它是否实际重复。 来自维基: 例如,为了至少有50%的概率发生一次碰撞,需要生成的随机版本4 UUID的数量为2.71 Quintillion,计算如下: 在此处输入图像描述 这个数字相当于在大约85年内每秒生成10亿个uuid,而一个包含这许多uuid的文件(每个uuid为16个字节)大约为45 exabytes,比目前存在的最大的数据库大很多倍,这个数据库大约有数百个petabytes。 |