UUID 是什么

UUID(通用唯一标识符,也称 GUID)是一个用来标记某物的 128 位值,一行、一个请求、一个文件,无需与他人协调。其名字中的承诺是:两个独立生成的 UUID 在一切实际意义上都永不相同。这让彼此独立的服务、离线设备和并行进程都能铸造标识符,而这些标识符在数据日后合并时不会冲突,无需中央分配者发放编号。

一个 UUID 写作 32 个十六进制数字,分为五个以连字符分隔的组:8-4-4-4-12,例如 550e8400-e29b-41d4-a716-446655440000。有两个特定位置不是随机的:一个版本半字节标识 UUID 是如何生成的,一个变体字段标记布局标准(现代的是 RFC 4122 / RFC 9562)。

版本 4:随机

到目前为止最常见的形式,版本 4 几乎完全是随机的:128 位中有 122 位来自一个安全的随机源,其余位被固定以标记版本和变体。有了这么多熵,对于任何现实数量的标识符而言,两个 v4 UUID 冲突的概率可忽略不计。

它的弱点不是唯一性,而是排序。因为 v4 值是随机的,连续的插入会散落在整个键空间。当一个 v4 UUID 被用作数据库主键时,那种随机性与 B 树索引相抵触:新行落在任意位置,损害缓存局部性,并随时间使索引碎片化。

版本 7:时间有序

版本 7,在 RFC 9562(2024)中标准化,正是为修复这一点而设计的。它把一个 48 位的毫秒级 Unix 时间戳 放在最高有效位,随后是用于同一毫秒内唯一性的随机位。因为时间戳在前,v7 UUID 在作为文本或字节比较时按创建顺序排序

这一单一性质使 v7 成为远更优的主键:新行追加在索引末尾附近而非散落,恢复了顺序整数键所享有的局部性,同时保留了 UUID 的去中心化唯一性。一个 v7 值还自带它自己的创建时间,你可以直接从那些前导位中读出,UUID 工具 在你检视一个 UUID 时就这么做。

其他版本,简述

为完整起见:版本 1 把一个时间戳与生成机器的 MAC 地址结合,这会泄露硬件身份和创建时间,因此引发隐私顾虑。版本 3 和 5 是基于名称的,它们对一个命名空间加一个名称做哈希(分别用 -1)以产生一个确定性的 UUID,当相同的输入必须始终映射到相同的标识符时很有用。版本 6 重排版本 1 的字段使其可排序,但对于新系统,v7 是推荐的时间有序选择。

选择一个

当你只需要一个随机、不透明的标识符且排序无关紧要时,选用 v4。当 UUID 将作为数据库键或任何其他受益于按创建时间排序之物时,选用 v7,这越来越成为默认建议。UUID 工具 同时生成两者,并解码你粘贴的任何 UUID 的版本、变体和嵌入的时间戳,全部在你的浏览器中。