UUID v4 还是 v7:该用哪一个,为何重要
需要一个纯随机的标识符时,用 UUID v4。标识符要作为数据库主键,或者希望 ID 能按创建时间排序时,用 UUID v7。两者都是 128 位,写法都是 36 个字符,区别在于这些位的排列方式。下方的 UUID 生成器 可以在你的浏览器中一次生成 1 到 500 个任一版本的 UUID。
UUID 生成器需要为代码生成唯一 ID免费使用UUID 长什么样
UUID,即通用唯一识别码,是一个 128 位的数字,写成 32 个十六进制数字,分成 5 组,每组分别为 8、4、4、4、12 个数字,用连字符隔开。例如:3f2b8c1e-6d4a-4f7b-9c2e-8a1d5e0b7f63。
其中有两部分是固定的。4 位用来表示版本,所以第三组开头对于 v4 是 4,对于 v7 是 7。2 位用来表示变体,所以第四组开头是 8、9、a 或 b。其余部分才是标识符本身。正因为有这些版本位和变体位,v4 UUID 实际只有 122 位随机数,而不是 128 位。
UUID v4:随机
v4 UUID 除了那些固定位之外,其余都是随机的。它的 122 位随机数使重复几乎不可能发生。假设你生成了十亿个 v4 UUID,其中任意两个相同的概率大约是 n 的平方除以可能取值数的两倍,结果约为 10 的负 19 次方。换句话说,碰撞不是你需要在设计中特别防范的问题。
这一估算的前提是生成器从密码学安全的随机源取数。如果生成器可以被预测,这一估算就不成立。本工具使用浏览器提供的密码学随机源,即 crypto.randomUUID 或 crypto.getRandomValues。
UUID v7:时间优先
v7 由 RFC 9562 定义。它的前 48 位是以毫秒为单位的 Unix 时间,所以较晚生成的 ID,其前半部分的数值比较早生成的更大。之后是版本位,然后是随机位、变体位,以及更多随机位。随机部分中可以保留一个计数器,这样在同一毫秒内生成多个 ID 时,它们仍能保持先后顺序。
因为时间位在前,只要以统一的大小写把 v7 ID 当作文本排序,结果就会精确到毫秒按创建时间排列。这是因为十六进制数字的长度是固定的,而时间位于开头字符。
时间也是可以看出来的。任何人读到一个 v7 UUID,都能大致看出它是什么时候生成的。你可以用 UUID 生成器 中的“检查”栏自己验证,它会把前 48 位还原成具体的日期和时间。
为什么 v7 更适合数据库索引
数据库索引通常是 B 树,这是一种按键值有序保存的结构。当键是随机的(如 v4)时,每个新行都会落在索引中的随机位置。数据库就得写入索引的许多不同部分,导致更多的页分裂和缓存未命中。在大表中,这些额外开销会不断累积。
v7 的键几乎总是比索引中已有的大多数键更大,因为其时间部分在不断增长。新行会被添加到索引的末尾,和自增数字的效果差不多。最近的索引页可以留在内存中,写入也更有条理。在持续增长的大表中,这种差异最明显;在小表里几乎察觉不到。
在 v4 和 v7 之间如何选择
- 数据库主键,或任何会随时间增长的表:选 v7。索引会保持有序。
- 经常按时间排序的日志、事件或消息:选 v7,因为 ID 本身就带有顺序。
- 不希望暴露创建时间的公开 ID:选 v4。v7 ID 会泄露它的生成时间。
- 多台设备、时钟不可靠:v4 和 v7 都能保持唯一,因为唯一性由随机位保证。只有 v7 的排序结果依赖时钟准确。
两个版本都是标准,但一些较旧的库可能只支持 v4。RFC 4122 多年来描述的是版本 1 到 5。RFC 9562 于 2024 年 5 月发布,取代了 RFC 4122,并定义了版本 6、7 和 8。在依赖某个库之前,请先确认它支持 v7。
如何存储 UUID
写成文本的 UUID 占 36 个字符。它的 16 个字节可以以二进制形式存储,占用空间少得多。许多数据库为此提供了原生的 UUID 类型或 16 字节的二进制列,而且比较速度也比文本快。
选定一种格式后就保持统一。对人来说,大写、小写、连字符和大括号都是同一个 UUID,但数据库或字符串比较可能把它们当作不同的值。生成器中的大写、不含连字符和大括号选项,就是为需要这些格式的系统准备的。
永远不要把 UUID 当作机密
UUID 是标识符,不是密码、会话令牌或访问密钥。它的设计目标是唯一,而不是不可猜测。v7 UUID 还包含创建时间。而且标识符常会被粘贴到链接、日志、邮件和截图中,任何看到它的人都可能重复使用。
访问控制应当放在服务器端。知道某个 ID 的人,不应自动获得查看或修改该 ID 所指记录的权限。对于密码、口令或令牌,请使用专门用于机密信息的生成器。密码生成器 可以借助安全随机数在你的设备上生成随机密码或单词口令,并估算其强度。如果想了解长度和随机性为何重要,可以阅读强密码与熵。
使用方法
- 需要随机 ID 时选择版本 4,需要按时间排序的 ID 时选择版本 7。
- 设置数量,每次可生成 1 到 500 个。
- 如果你的代码需要特定格式,勾选大写、不含连字符或大括号。
- 复制全部结果,或将列表下载为 .txt 文件。
- 在“检查”栏下粘贴任意 UUID,即可读出它的版本、变体,以及 v7 中包含的时间。
常见问答
v4 UUID 是唯一的吗? 实际上是的。它的 122 位随机数使重复的可能性极小,你无需专门检查。
所有场景都该用 v7 吗? 不一定。数据库主键和任何按时间排序的内容用 v7;如果希望隐藏创建时间,则用 v4。
可以把 UUID 当作密码吗? 不可以。它是标识符。凡是需要保密的内容,请使用密码生成器。
工具会把 ID 发送到别处吗? 不会。ID 在你的浏览器中生成并显示,不会发送到服务器。
由 AI 辅助翻译自英文原文。
评论
还没有评论。快来抢沙发。


