如何生成 UUID v4
设置数量和文本格式后生成。底层 128 位值始终写入 v4 版本位和 RFC 变体位;大小写与移除连字符只改变显示,不改变随机字节。
- 输入 1 到 1000 的整数,限制可避免误操作导致页面和剪贴板过大。
- 通常保留 8-4-4-4-12 连字符形式,只有目标字段要求 32 位十六进制时才移除。
- 大写仅用于兼容展示,UUID 比较通常应忽略大小写。
- 生成并复制后,确认目标数据库字段长度、唯一约束和格式校验。
案例与预期行为
| 输入 | 输出 | 说明 |
|---|---|---|
1 个,小写,含连字符 |
550e8400-e29b-41d4-a716-446655440000 |
标准文本分为 8、4、4、4、12 个十六进制字符。 |
1 个,大写 |
550E8400-E29B-41D4-A716-446655440000 |
大小写只改变文本展示。 |
1 个,无连字符 |
550e8400e29b41d4a716446655440000 |
紧凑形式仍包含相同 128 位。 |
版本位 |
xxxxxxxx-xxxx-4xxx-… |
第三组首个十六进制数字为 4。 |
变体位 |
…-[8|9|a|b]xxx-… |
第四组首位承载 RFC 变体。 |
数量 1001 |
拒绝 |
单次生成上限为 1000。 |
UUID v4 结构与标准
UUID 是 128 位标识,常写成 32 个十六进制字符并分成 8-4-4-4-12。版本 4 固定一部分版本与变体位,剩余 122 位来自随机源。该文本格式被数据库、语言和 API 广泛支持。
本工具优先调用 crypto.randomUUID;若浏览器没有该方法,则用 crypto.getRandomValues 填充 16 字节并设置版本和变体位。回退绝不使用 Math.random。大写和连字符处理只在生成后作用于文本。
- 规范形式通常是小写十六进制加连字符。
- 版本字段必须为 4。
- 变体字段首位应为 8、9、a 或 b。
随机性、碰撞与实际保障
122 个随机位提供巨大空间。随机源可靠时,普通业务规模发生碰撞的概率可以忽略,因此多个客户端可在不联系中央序列的情况下生成 ID。
实际风险还包括随机源缺陷、虚拟机克隆、实现错误和数据库字段截断。存储时应保留完整值,并在重复会破坏数据一致性时建立唯一约束。工具无法验证复制后是否被截断或改写。
- 数据库应使用 UNIQUE 约束。
- 不要截短 UUID 作为短码。
- 导入测试应确认 32 个十六进制字符完整保留。
UUID 是标识,不是密钥
随机 UUID 比自增 ID 更难猜,但它不是授权凭证。UUID 经常出现在 URL、日志、分析和客户端代码中。如果只凭知道对象 ID 就允许访问,会形成越权漏洞,所有请求仍需独立鉴权。
也不应直接把 UUID 当加密密钥、重置密码 Token 或长期 API 密钥。安全 Token 通常需要更明确的熵、编码、过期、吊销和服务端哈希存储设计。应使用成熟身份认证库。
- 对象标识与访问控制必须分离。
- 不要因为字符串像 UUID 就把它当秘密。
- 凭证和重置链接使用专门随机 Token。
批量与文本格式选择
批量生成适合测试夹具、迁移映射、离线记录和种子数据。单次上限 1000,避免错误数量造成长时间阻塞和巨大剪贴板。每个 UUID 都独立调用安全随机源。
连字符更容易识别,旧系统有时要求 32 位紧凑形式;大小写多用于报表兼容。严格字符串比较可能受大小写影响,应在系统边界选择并记录统一格式。
- 输出每行一个 UUID,便于脚本处理。
- 大小写表示相同十六进制值。
- 无连字符仍是同一 UUID,但严格校验器可能拒绝。
常见用途与不合适替代
适合分布式主键、客户端先创建记录、文件标识、链路追踪 ID 和测试数据。它不会像顺序 ID 那样直接暴露记录数量,但高写入数据库仍需评估索引局部性和存储成本。
时间戳可预测且可能重复,不适合替代随机 UUID。内容哈希由数据决定,适合完整性和内容寻址。单数据库内部自增 ID 更简单、索引更友好。应因为需要去中心化唯一性而选择 UUID,而不是只因为外观复杂。
- 离线准备导入映射。
- 在分布式请求入口创建关联 ID。
- 为客户端暂存记录预分配 ID。
- UUID v4 不适合作为按时间排序字段。
错误、浏览器支持与验证
数量不是整数、小于 1 或大于 1000 时会拒绝。如果 crypto.randomUUID 和 crypto.getRandomValues 都不可用,也会安全失败,不会降级到弱随机。现代安全上下文通常支持这些 API,但旧 WebView 或受限环境可能例外。
测试可以验证格式、版本位、变体位和数量上限,但确定性单元测试不能证明某台真实设备的熵质量。本交付依赖平台 Web Crypto 契约,不会把模拟随机源说成真实浏览器随机验证。
- 现代 Web Crypto 通常需要 HTTPS 或可信本地环境。
- API 边界仍要校验 UUID 格式。
- 正则匹配成功不等于来源一定安全。
与哈希和时间戳的区别
UUID v4 是随机值,与内容无关;哈希对同一字节总是相同,用于完整性和内容寻址;时间戳表示时间且可预测;HMAC 使用密钥认证数据。
其他新版 UUID 可能提供时间排序,但本页按需求只实现 v4。数据库局部性是核心需求时,应评估标准化时间有序 ID,不要自行拼接时间戳和随机数。