GUID是否有可能被全部使用完?

13

考虑到每个GUID都由16个字节表示。因此最多有2^128种可能性= 3.4028237e+38个可能的GUID。

是否有可能将所有GUID都用完?


11
当然。即使每秒只生成一个全局唯一标识符(GUID),我们也会在不到9百万亿年的时间内用尽它们,这远早于宇宙热死亡的时间。 - Kevin
3
这个问题是合理的,但更重要的问题是:我需要保护自己免受意外复制吗?答案是100%不需要。 - usr
@usr 假设GUID完全随机生成。 - D Stanley
就像人们认为IPv4足够了一样,现在我们需要IPv6。哈哈,只是在想。也许某些激进的突破性技术可以改变我们跟踪数据的方式?例如量子计算?物联网?量化自我?如果在10年后,每个人每秒钟产生数十亿个数据点(每个都有一个GUID),那会怎么样呢?:P - Chris Yeung
并且可能会导致机器与人的比例变得难以置信地巨大。 - Chris Yeung
3个回答

14
为了向您展示2^128个GUID有多大:
1个GUID = 16字节。
因此,2^128个GUID每个都需要16字节的存储空间,即:
2^4 * 2^128 = 2^132字节
这相当于5,444,517,870,735,015,415,413,993,718,908,291,383,296字节;这是一个有40位数字的数,5.445 x 10^39字节。

没有足够大的存储单位来量化这个数字——最大的标准化数据单位是“尧字节”,即使我们使用它,我们仍然得到一个16位数值,或者5.445万亿尧字节(5.445 x 10^15)。

所以,首先你需要担心能否存储那么多的GUID,然后才能考虑是否会用完它们。

基本上:你几乎不可能用完。


碰撞

因为我听到很多人担心碰撞问题,所以我将扩展我的答案,包括对碰撞可能性的分析。

这里需要注意一个警告-(大部分)符合RCC-spec规范的随机生成UUID实际上只有122位的随机性,而不是128位,因为有6位被保留用于表示正在生成的UUID的版本变体。这减少了可生成的UUID数量,并增加了碰撞的潜在可能性,但实际上并没有太大关系,因为仍然有非常多的可能的UUID(但它确实稍微改变了碰撞计算)。

根据生日悖论(应用于哈希函数),预期需要生成的哈希次数,直到出现碰撞,可以粗略地近似为2^(n/2),其中n是总的随机位数。
因此,对于我们的具有122个随机位的UUID:
2^(122 / 2) = 2^61

这意味着,当你生成2^61个UUID时,每次生成UUID都有大约50%的几率发生碰撞。作为一个具体的数值,这大约是2.3十万亿。
2,305,843,009,213,693,952 UUIDs

这大致相当于每秒生成10亿个UUID,持续73年
            1,000,000,000     UUIDs/second
                       60     seconds/minute
                       60     minutes/hour
                       24     hours/day
                      365.25  days/year
*                      73     years
------------------------------------------
2,303,704,800,000,000,000     Total UUIDs

(这也是一个非常大的存储空间-2.304艾字节,或者说2.3百万兆字节)
另外请注意,这一切都是基于UUID使用了一个良好的随机算法和一个良好的熵源(即在任何给定时间生成的所有可能的UUID都是等概率的)。
总而言之,UUID/GUID被专门设计用来最小化碰撞的几率,实际上你几乎不需要担心这个问题。比起自然生成碰撞,更有可能的是算法或代码中存在错误导致碰撞的发生。
相关阅读:

5

不行。即使你假设在某个领域中GUID的使用率极高,并且时间尺度极长,GUID的关键点是其唯一性。一旦你开始出现任何实际相关概率的重复,人们就会停止使用GUIDs,因此不会再使用更多。当然,在某些区域中他们可能会使用一些看起来像GUID的数字,其中足够低的使用率仍然可以有助于确保本地唯一性,但那些只是LUIDs,如果运气好的话,人们也会这样称呼它们。


1
我在想,如果总有一天70亿人每个人都有10台设备(可穿戴设备+电脑),每秒生成100个数据点。仍然需要1.54e+18年才能全部消耗完。也许我应该重新提问:“是否可能我们拥有1.54e+16个设备,每秒生成多个GUID,并最终消耗完所有GUID?” - Chris Yeung
好吧,我想我们可以使用32个字节来存储GUID了...哈哈 - Chris Yeung
@ChrisYeung:我猜对于巨大的数字,经典答案是假设指数增长。人类殖民太空,或者创造使用GUID的机器来实现这一点,并以指数速度繁殖。但是这些细节属于科幻小说领域,而不是Stack Overflow。 - MvG

-3
我只想补充一点,很可能我们不希望出现1%的重复Guid。然而,为了达到这个目标,你需要覆盖2^121(2658455991569831745807614120560689152)种组合,才有0.78125%的概率出现重复的Guid。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接