我知道 UUID 的冲突率实际上为零,但为什么保证如此低的冲突率全球?
根据RFC 4122,
版本 4 UUID 用于从真随机数或伪随机数生成 UUID。
如果你使用 PRNG,就会有一个种子。因此应该存在两个 UUID 生成器(意外地)共享相同种子的情况。在这种情况下,会发生什么?
因此应该存在两个 UUID 生成器(意外地)共享相同种子的情况。在这种情况下,会发生什么?
没什么,相同的 UUID4 只会生成多次。这甚至不依赖于“坏”随机性,这可能是由伪随机数生成器的确定性种子引起的。 “坏”随机性只会让这种情况更有可能发生,但碰撞总是有非零概率。
如果我实现以加密不安全方式播种的 UUID 生成器(例如,仅使用整数
而不是0
),它是否符合标准?/dev/random
从技术上讲,是的,RFC 没有对所使用的伪随机数指定要求。 6 以下。安全考虑,它说(强调我的):
不要假设 UUID 很难猜测;例如,它们不应该被用作安全功能(仅拥有即可授予访问权限的标识符)。 可预测的随机数源会加剧情况。
这意味着可预测的随机数源仍然满足 RFC 关于伪随机性的要求。
同一章节还说:
在多个主机上生成 UUID 的分布式应用程序必须愿意依赖所有主机上的随机数源。如果这不可行,则应使用命名空间变体。
这将随机数如何生成以及生成的 UUID 发生冲突的可能性的责任从 RFC 转移到了实现。另请参阅此软件工程 StackExchange 答案。
就我个人而言,我希望实现能够使用相当高质量的随机性。例如,Java 的
java.util.UUID.randomUUID
和 CPython 的 uuid.uuid4
使用加密安全随机性。
UUID 是标准化标识符,有多种版本。 UUID 版本 4 (UUIDv4) 遵循特定格式,由 32 个十六进制数字组成,分为五组,格式为 8-4-4-4-12,总共 36 个字符,包括连字符。
要手动验证 UUIDv4,您可以对输入字符串执行特定检查:
带零的 UUID 版本 4 可能是: