UUID 的演进:深入理解版本 1、6 和 7
通用唯一标识符(UUID)几十年来一直是分布式系统的基石,提供了一种无需中央协调即可生成唯一键的可靠方式。虽然依赖纯随机数的 UUID 版本 4 是最知名且应用最广的变体,但当用作关系型数据库管理系统(RDBMS)的主键时,它存在固有局限性。随机性对于不可预测性非常优秀,但对于数据库索引却极其糟糕。将随机 UUID 插入 B-Tree 索引会导致大量的页分裂和索引碎片,随着时间的推移降低写入性能。这就是基于时间的 UUID(特别是版本 1、6 和 7)发挥作用的地方,它们提供了一种兼顾唯一性和时间顺序的结构化替代方案。
UUID 版本 1 是将唯一性与时间结合的首次尝试。它使用当前时间戳、时钟序列和节点的 MAC 地址来生成标识符。包含 MAC 地址保证了不同机器之间的空间唯一性,而时间戳则保证了时间唯一性。然而,UUID v1 在数据库索引方面存在致命缺陷:其时间戳的结构使得有效位代表最低的时间粒度。简单来说,随着时间的推移,UUID 字符串的开头变化迅速且不可预测,破坏了顺序排序的可能性。此外,暴露 MAC 地址引发了严重的隐私和安全担忧,导致许多开发者彻底放弃了 v1。
为了解决这些显著问题,工程界引入了 UUID 版本 6 和版本 7。UUID v6 本质上是重构后的 UUID v1。它重新排列了 v1 的时间戳组件,使最高有效位代表最高的时间粒度(年、月、日),一直向下延伸到亚秒级。这种简单的重排确保了 UUID v6 值可以按时间进行字典序排序。如果您今天生成一个 v6 UUID,明天生成另一个,明天的 UUID 将排在今天的后面,这与数据库 B-Tree 期望的数据插入方式完全吻合。这消除了与 v4 相关的索引碎片以及 v1 无法排序的问题,同时保持与传统 UUID 结构的兼容性。
UUID 版本 7 将这种优化提升到了一个新的高度,代表了现代数据库主键的金牌标准。UUID v7 放弃了 v1 和 v6 使用的旧版儒略/格里高利历法纪元,转而采用标准的 Unix 纪元时间戳(自 1970 年 1 月 1 日 UTC 午夜以来的毫秒数)。该时间戳占用标识符的前 48 位。其余位填充有强密码学随机数据。这种混合方法结合了高性能数据库插入所需的顺序排序能力与随机数据生成的安全性及隐私性。通过使用我们 100% 免费、私密的浏览器端 UUID 生成器,您可以即时创建这些现代标识符,且零服务器上传。