UUID如何做到全局唯一?

问题描述 投票:0回答:2

我知道 UUID 的冲突率实际上为零,但为什么保证如此低的冲突率全球

根据RFC 4122

版本 4 UUID 用于从真随机数或伪随机数生成 UUID。

如果你使用 PRNG,就会有一个种子。因此应该存在两个 UUID 生成器(意外地)共享相同种子的情况。在这种情况下,会发生什么?

security uuid
2个回答
3
投票

因此应该存在两个 UUID 生成器(意外地)共享相同种子的情况。在这种情况下,会发生什么?

没什么,相同的 UUID4 只会生成多次。这甚至不依赖于“坏”随机性,这可能是由伪随机数生成器的确定性种子引起的。 “坏”随机性只会让这种情况更有可能发生,但碰撞总是有非零概率。

如果我实现以加密不安全方式播种的 UUID 生成器(例如,仅使用整数

0
而不是
/dev/random
),它是否符合标准?

从技术上讲,是的,RFC 没有对所使用的伪随机数指定要求。 6 以下。安全考虑,它说(强调我的):

不要假设 UUID 很难猜测;例如,它们不应该被用作安全功能(仅拥有即可授予访问权限的标识符)。 可预测的随机数源会加剧情况

这意味着可预测的随机数源仍然满足 RFC 关于伪随机性的要求。

同一章节还说:

在多个主机上生成 UUID 的分布式应用程序必须愿意依赖所有主机上的随机数源。如果这不可行,则应使用命名空间变体。

这将随机数如何生成以及生成的 UUID 发生冲突的可能性的责任从 RFC 转移到了实现。另请参阅此软件工程 StackExchange 答案

就我个人而言,我希望实现能够使用相当高质量的随机性。例如,Java 的

java.util.UUID.randomUUID
CPython 的
uuid.uuid4
使用加密安全随机性。


0
投票

UUID 是标准化标识符,有多种版本。 UUID 版本 4 (UUIDv4) 遵循特定格式,由 32 个十六进制数字组成,分为五组,格式为 8-4-4-4-12,总共 36 个字符,包括连字符。

要手动验证 UUIDv4,您可以对输入字符串执行特定检查:

  1. 长度检查:确保UUID字符串长度为36个字符。
  2. 位置检查:确认字符串中索引 8、13、18 和 23 处连字符的位置。
  3. 版本标识: UUIDv4 在第 15 个位置包含“4”。
  4. 内容检查: UUIDv4 在第 20 位应至少包含“8”、“9”、“a”或“b”之一。

带零的 UUID 版本 4 可能是:

  • 00000000-0000-4000-8000-000000000000
  • 00000000-0000-4000-9000-000000000000
  • 00000000-0000-4000-a000-000000000000
  • 00000000-0000-4000-b000-000000000000
© www.soinside.com 2019 - 2024. All rights reserved.