UUID 生成与检查
生成版本 4(随机)或版本 7(按时间排序)的 UUID,一次一个到一千个,可以复制或存成文本文件;也可以粘贴任意 UUID,查看它的版本、变体和里面的时间。全部在浏览器里运行,不会上传任何内容。
生成 UUID
版本 4 含 122 位随机数。版本 7 以当前时间(毫秒)开头,所以后生成的 UUID 排在先生成的后面;同一毫秒内用计数器保证一批 UUID 按生成顺序排列。Nil 和 Max 是固定的特殊值,不是唯一标识。
全部在你的浏览器里用浏览器自带的安全随机数生成器完成,不会发送、保存或记录任何内容。
检查 UUID
带不带连字符、大小写、花括号 { } 和 urn:uuid: 前缀都可以。
有效的 UUID
- 标准写法
- 017f22e2-79b0-7cc3-98c4-dc0c0c07398f
- 版本
- 7:Unix 毫秒时间,后接随机数
- 变体
- RFC 9562 / RFC 4122(常见的一种)
- 内含的时间(UTC)
- 2022-02-22 19:22:22.000 UTC(Unix 毫秒时间)
- 说明
- 这是生成者写进 UUID 的时间,无法证明它是真的,因为任何人都可以写入任意时间。
两个重复的概率
其中至少有两个相同的概率:9.40 x 10^-20
大约 1.06 x 10^19 分之一。
按 p = 1 - e^(-n(n-1) / 2^123) 计算,这是 122 位随机数常用的生日问题估算,并假设随机数源是理想的。要生成大约 2.7 x 10^18 个 UUID,出现重复的概率才会达到 50%。
工作原理
- •随机数来自浏览器的安全随机数生成器(crypto.getRandomValues),从不使用 Math.random。版本 4 的 UUID 共 128 位,其中 6 位固定用来标记版本和变体,剩下 122 位是随机的。
- •版本 7 的 UUID(RFC 9562)前 48 位是当前的 Unix 时间(毫秒),后面是版本、变体和随机位。同一毫秒内生成的 UUID 用只增不减的计数器,所以一批 UUID 按生成顺序排序,即使你再次点击“生成”也一样。
- •如果时钟往回走,工具会沿用见过的最后一个时间,而不会生成排在更前面的 UUID。UUID 里的时间只是生成者写进去的,没有任何东西能证明它是真的。
- •为什么 v7 适合做数据库主键:索引条目按键的顺序存放。随机的 v4 键会落在索引的随机位置,每次插入可能碰到索引的不同部分;v7 键随时间增长,新行会插在末尾,紧挨着刚写入的条目。这说的是排序这个事实,并不是速度的保证;效果取决于你的数据库、表的大小和负载,请在自己的环境里测量。如果不想让 ID 暴露创建时间,请选 v4。
- •重复的概率:对 n 个随机的版本 4 UUID,至少有一对相同的概率约为 1 - e^(-n(n-1) / 2^123),前提是随机数源理想。要生成约 2.7 x 10^18 个才会达到 50%,按每秒十亿个算大约要 86 年。一百万个 UUID 的重复概率约为 9.4 x 10^-26。
- •检查器把版本 1 和版本 6 的时间当作从 1582 年 10 月 15 日起、以 100 纳秒为单位的计数,把版本 7 的时间当作 Unix 毫秒。大小写、不带连字符、花括号和 urn:uuid: 前缀都能识别。
常见问题
- 该用 UUID v4 还是 v7?
- 想要一个不透露任何信息的 ID(比如出现在链接里)就用 v4。ID 用作数据库主键、希望新行排在旧行后面(让插入集中在索引的同一处)就用 v7。v7 的 ID 会大致显示它是什么时候生成的。
- 这些 UUID 可靠吗?
- 它们来自浏览器的加密级随机数生成器,网站生成安全令牌用的就是同一个来源。两个生成的 UUID 重复在现实中不必担心。不过 UUID 是标识而不是秘密:不要把它当密码或访问密钥用。
- Nil 和 Max UUID 是什么?
- Nil 是全 0,Max 是全 1。标准把它们定义为特殊值,例如表示“没有值”。它们每次都一样,不标识任何东西。
- 会上传或保存什么吗?
- 不会。UUID 在你的浏览器里生成和检查,没有任何内容发送到服务器,也不会被保存。关闭或刷新页面后就清空了。