跳到主要内容

2. 动机

2. 动机

使用 UUID 的主要原因之一是无需集中式权威机构来管理它们 (尽管有两种格式可以利用可选的 IEEE 802 Node ID, 其他格式则不会). 因此, 按需生成可以完全自动化, 并可用于多种目的. 本文描述的 UUID 生成算法在必要时支持每台机器每秒 1000 万个或更多的极高分配速率, 因而甚至可以用作事务 ID.

UUID 具有固定大小 (128 位), 与其他替代方案相比相当小. 这非常适合各种排序、定序和散列; 适合存储在数据库中; 也便于简单分配和一般编程.

由于 UUID 唯一且持久, 它们非常适合作为 URNs. 无需注册流程即可生成新 UUID 的独特能力, 使 UUID 成为铸造成本最低的 URNs 之一.

2.1. 更新动机

自 UUID 最初创建以来, 许多情况已经发生变化. 现代应用程序需要创建并使用 UUID 作为复杂计算系统中各种不同对象的主标识符, 包括但不限于数据库键、文件名、机器或系统名称, 以及事件驱动事务的标识符.

UUID 越来越受欢迎的一个领域是数据库键. 这源于现代应用程序日益分布式的特性. 在这种情况下, 数据库常用的 "auto-increment" 方案效果并不好: 在网络中协调顺序数字标识符所需的工作很容易成为负担. UUID 能够在分布式系统中创建唯一且相对较短的值, 且不需要协调, 这使它们成为一种良好的替代方案. 但是, 最初由 [RFC4122] 定义的 UUID versions 1-5 缺少某些其他理想特性, 例如:

  1. 不按时间排序的 UUID 版本, 例如 UUIDv4 (见 Section 5.4), 具有较差的数据库索引局部性. 这意味着连续创建的新值在索引中彼此并不接近; 因此, 插入需要在随机位置执行. 由此对常用结构 (B-tree 及其变体) 产生的负面性能影响可能非常显著.

  2. UUIDv1 时间戳 (见 Section 5.1) 使用的 100 纳秒 Gregorian Epoch 并不常见, 并且难以使用 [IEEE754] 所述的标准数字格式准确表示.

  3. 若要按时间序列排序, 需要进行内省/解析, 而不能执行简单的逐字节比较.

  4. 在 UUIDv1 的 node 字段中使用媒体访问控制 (Media Access Control, MAC) 地址会引发隐私和网络安全问题. 暴露的 MAC 地址可被用作攻击面, 以定位网络接口并揭示关于这些机器的各种其他信息 (至少包括制造商, 还可能包括其他细节). 此外, 随着虚拟机和容器的出现, MAC 地址的唯一性不再得到保证.

  5. [RFC4122] 中规定的许多实现细节涉及权衡, 这些权衡既无法为所有应用程序指定, 也并非产生可互操作实现所必需.

  6. [RFC4122] 没有区分生成 UUID 的需求和仅存储 UUID 的需求, 尽管二者通常不同.

由于上述问题, 许多广泛分发的数据库应用程序和大型应用程序供应商都试图解决创建更好的基于时间且可排序的唯一标识符的问题, 以便将其用作数据库键. 这导致过去 10 多年中出现了大量实现, 它们以略有不同的方式解决同一个问题.

在准备本规范时, 分析了以下 16 种不同实现, 以观察它们在总 ID 长度、位布局、词法格式化和编码、时间戳类型、时间戳格式、时间戳精度、节点格式和组成部分、冲突处理, 以及多时间戳 tick 生成序列方面的趋势:

  1. [ULID]
  2. [LexicalUUID]
  3. [Snowflake]
  4. [Flake]
  5. [ShardingID]
  6. [KSUID]
  7. [Elasticflake]
  8. [FlakeID]
  9. [Sonyflake]
  10. [orderedUuid]
  11. [COMBGUID]
  12. [SID]
  13. [pushID]
  14. [XID]
  15. [ObjectID]
  16. [CUID]

对这些实现以及上述问题的考察促成了本文档, 其中新的 UUID 被调整为解决这些问题.

此外, [RFC4122] 本身也需要一次全面修订, 以处理若干主题, 包括但不限于以下内容:

  1. 实现各种勘误报告. 这些勘误主要围绕位布局澄清, 这些澄清曾导致不一致的实现 [Err1957], [Err3546], [Err4975], [Err4976], [Err5560] 等.

  2. 将其他 UUID 版本与 UUIDv1 位布局解耦, 使得像 "time_hi_and_version" 这样的字段无需在非基于时间的 UUID 中被引用, 同时也为 UUIDv3、UUIDv4 和 UUIDv5 提供类似于 UUIDv1 的定义章节.

  3. 围绕现有实现和原型实现观察到的许多真实场景和边界情况, 提供实现最佳实践.

  4. 针对现代环境中的 MAC 地址、散列算法、安全随机性和其他主题, 处理安全最佳实践和注意事项.

  5. 为实现提供一种基于标准的选项, 用于特定于实现和/或实验性的 UUID 设计.

  6. 提供更多测试向量, 展示按照本规范创建的真实 UUID.