【问题标题】:Is there any possibility that GUID will all be used up?GUID是否有可能全部用完?
【发布时间】:2023-03-19 04:20:02
【问题描述】:

假设每个 GUID 由 16 个字节表示。所以充其量有 2^128 种可能性 = 3.4028237e+38 种可能的 GUID。

会不会全部用完?

【问题讨论】:

  • 当然。即使每秒只生成一个 GUID,我们也将在短短 9 万亿年之内用完。那远在宇宙热寂之前。
  • 这个问题是正确的,但更重要的问题是:我需要保护自己免受意外重复吗?答案是 100% 否。
  • @usr 假设 GUID 是完全随机生成的。
  • 就像人们认为 IPv4 就足够了,现在我们需要 IPv6。哈哈只是想知道。可能是一些激进的突破性技术可能会改变我们跟踪数据的方式?例如量子计算?物联网?量化自我?如果 10 年后我们生活在一个每人每秒生成数十亿个数据点(每个都有一个 guid)的世界,那会怎样。 :P
  • 并且可能以某种方式机器:人类的比例变得难以置信地巨大。

标签: sql math guid uuid


【解决方案1】:

向您展示 2^128 GUID 有多大:

1 GUID = 16 bytes

因此2^128 GUIDS 需要2^4 * 2^128 bytes 来存储。

2^4 * 2^128 = 2^132 bytes

使用 Python,我计算出这需要:
4,951,760,157,141,521,099,596,496,896 TB。

因此,首先您需要担心是否能够存储这么多 GUID,然后才能考虑用完它们。

基本上:你不可能用完。


碰撞

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

在发生冲突之前您需要的 UUID 数量 average 是:

2^128 / 2 = 2^127

这意味着50% 有可能在您生成2^127 GUID 时发生冲突。您需要的 GUID 数量为:

170141183460469231731687303715884105728 GUIDs

如果我错了,请有人纠正我,但是:这意味着产生冲突的可能性非常小,甚至不值得检查刚刚生成的 UUID 是否已经存在于您的数据库中。

注意:这一切都假设 UUID 是使用良好的随机性算法和良好的熵源生成的。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 当时在想,如果有一天 70 亿人每人拥有 10 台设备(可穿戴设备 + 计算机),每台设备每秒生成 100 个数据点。消耗全部仍需 1.54e+18 年。也许我应该将问题改写为我们有可能有 1.54e+16 台设备每秒生成多个 guid,并最终消耗所有 guid..
    • 好吧,我想我们可以使用 32 个字节来存储 guid 然后......哈哈
    • @ChrisYeung:我猜对巨大数字的经典答案是假设指数增长。人类殖民太空,或创建使用 GUID 的机器,并且以指数速度繁殖。但这些细节属于科幻小说领域,而不是 Stack Overflow。
    【解决方案3】:

    我只想补充一点,我们很可能不希望达到 1% 的重复 Guid。尽管如此,您需要覆盖 2^121 (2658455991569831745807614120560689152) 组合,以便有 0.78125% 的机会重复 Guid。

    【讨论】:

      猜你喜欢
      • 2023-02-08
      • 1970-01-01
      • 2010-09-16
      • 2020-12-28
      • 1970-01-01
      • 2015-02-26
      • 2016-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多