UUID v7 生成器:时间排序的不可猜测标识符
为何需要 UUID v7
传统 UUID v4 完全随机生成,写入数据库时会导致 B‑tree 索引频繁分裂,降低插入性能。UUID v7 通过在标识符开头嵌入 48 位 Unix 毫秒时间戳,使得生成的 ID 按创建时间自然排序。这解决了索引局部性问题,同时保留 74 位随机位(共 128 位)保证不可猜测。本页面提供浏览器端本地生成,无需服务器参与,隐私安全。
页面功能与操作
用户可设置三个参数:
- 数量:1 到 100 之间的整数。
- 大写:切换 UUID 字母部分的大小写。
- 包含连字符:控制输出是否带有标准格式的 4 个连字符。
任何参数变更都会立即重新生成全部 ID。生成的 ID 列表可逐个点击复制(单个复制),也可通过“复制全部”按钮将列表中所有 ID 一次性复制到剪贴板,状态栏会显示“已复制全部!”确认信息。页面初始状态显示“就绪”,生成后变为“已生成”。
UUID v7 的格式与排序特性
UUID v7 用 36 个字符表示,格式如 018f3a6e-1b2c-7d8e-9f0a-1b2c3d4e5f6。前 8 个字符(32 位)是时间戳的高 32 位,随后一个短横线,接着是 4 字符的时间戳中间 16 位,再后是一个版本位固定的 4 字符段(7 表示版本),然后是变体位和随机位,最后 12 字符为剩余随机部分。
时间戳精度为毫秒,因此同一毫秒内生成的多个 ID 不保证严格顺序。这与 ULID 类似,两者都按创建时间排序但允许同毫秒内乱序。相比之下,UUID v4 完全不排序,而 UUID v7 的排序特性大幅提升数据库写入性能。
生成原理与安全性
页面使用浏览器内置的 crypto.getRandomValues() 产生强随机数,完全在本地计算,绝不将数据发送到任何服务器。每个 UUID v7 的 74 位随机部分由浏览器生成,符合密码学安全要求。生成过程:
- 获取当前 Unix 毫秒时间戳(48 位)。
- 将时间戳填入前 48 位。
- 设置版本位(位 48-51 固定为
0111,即十六进制7)。 - 设置变体位(位 64-65 固定为
10,遵循 RFC 9562)。 - 用随机位填充剩余 74 位。
- 按照 8-4-4-4-12 的分组规则加上连字符(除非用户选择移除)。
- 根据大写选项转换字母。
适用场景与典型用户
- 分布式系统开发者:需要全局唯一且可按时间排序的键,用于事件溯源、消息队列、审计日志。
- 数据库管理员:希望减少 UUID v4 带来的索引碎片,提升 InnoDB 或类似 B‑tree 引擎的写入吞吐量。
- 安全工程师:要求标识符不可猜测,防止顺序枚举(时间戳部分虽然按顺序却无法预测,因为 ID 还包含随机位)。
- 从 v4 迁移的团队:UUID v7 格式上兼容(同为 36 字符),但排序性质改进,无需更改现有存储字段长度。
与其他标识符格式的对比
| 特性 | UUID v7 | UUID v4 | ULID | NanoID |
|---|---|---|---|---|
| 长度 | 36字符 | 36字符 | 26字符 | 21字符(默认) |
| 排序性 | 时间排序(毫秒级) | 不排序 | 时间排序(毫秒级) | 不排序 |
| 时间精度 | 毫秒 | 无 | 毫秒 | 无 |
| 碰撞概率 | 极低(74位随机) | 极低(122位随机) | 极低(80位随机) | 取决于长度 |
| 不可猜测性 | 是 | 是 | 是 | 可配置 |
常见问题
问:UUID v7 是否保证全局严格递增?
答:不保证。在同一毫秒内生成的 ID 可能不按生成顺序排列,因为排序仅依赖时间戳,而时间戳精度到毫秒。如果需要微秒级严格排序,应考虑其他方案(如 Snowflake)。
问:为什么生成时需要一个数量限制?
答:页面限制 1-100 个,避免一次性生成大量 ID 导致浏览器 UI 冻结。同时满足多数开发场景下批量测试的需求。
问:移除连字符后还是标准 UUID 吗?
答:连字符属于可选显示格式。标准的 UUID 文本表示包含连字符,但许多系统接受无连字符的 32 位十六进制字符串。本工具允许用户按需选择。
问:时间戳会溢出吗?
答:48 位 Unix 毫秒时间戳最大可表示约 8925 年后的时间,远超出当前计算机系统寿命,无需担心。
问:浏览器生成的随机数是否足够安全?
答:是的。crypto.getRandomValues() 使用操作系统提供的密码学安全随机源(如 Linux 的 /dev/urandom),适合生成 UUID v7 的随机部分。
问:为什么不在同一毫秒内添加序列号实现严格排序?
答:UUID v7 规范(RFC 9562)未强制要求序列号。如果需要严格排序,可在应用层添加单调计数器,但这会牺牲随机位的一部分。本工具遵循标准实现,保留最大随机性。