什么是短 UUID
标准 UUID 写成文本是 36 个字符,其中 4 个是连字符。如果把它按 base64url 编码,128 位可以压成 22 个字符,而且不含任何需要转义的符号。
也可以生成更短的版本。8 字节(64 位)适合临时令牌,12 字节(96 位)介于两者之间,16 字节则和标准 UUID 一样多的随机位。
使用方法
- 在随机字节数里选择长度:8、12 或 16 字节。
- 设置数量,然后点击生成 UUID。
- 结果使用 base64url 字母表,可以直接放进 URL 或文件名。
适用场景
- 短链接和分享链接的标识。
- 对长度敏感的文件名或本地存储的键。
- 没必要用满 128 位的临时令牌。
结构
从加密随机源取出 N 个字节,再用 base64url(A–Z、a–z、0–9、-、_)编码,并去掉末尾的等号填充。
短 UUID 的定位
| 选项 | 何时使用 |
|---|---|
22 个字符 | 128 位 base64url,随机强度等同标准 UUID |
标准 UUID | 36 个字符更易识别,任何系统都能直接解析 |
v7 | 需要按时间排序时用它,而不是更短的随机值 |
UUID 各版本速查表
| 版本 | 可排序 | 数据来源 | 适合的场景 |
|---|---|---|---|
| v1 | 不可以 | 时间戳 + MAC 地址 | 仍在依赖 v1 的既有系统 |
| v3 | 不可以 | 名称的 MD5 哈希 | 必须使用 MD5 时的确定性标识符 |
| v4 | 不可以 | 122 位随机数 | 绝大多数普通的唯一标识需求 |
| v5 | 不可以 | 名称的 SHA-1 哈希 | 需要同一名称始终得到同一标识符 |
| v6 | 可以 | 重排后的时间戳 | 既要随机性又要便于排序 |
| v7 | 可以 | 毫秒精度的 Unix 时间 | 数据库主键和事件标识符 |
| v8 | 不可以 | 自定义位布局 | 专有格式和实验性用途 |
这七个版本都是 128 位,都用同样的 8-4-4-4-12 写法表示,区别只在于各个位代表什么。
代码示例
javascript
const b = new Uint8Array(16);
crypto.getRandomValues(b);
const id = btoa(String.fromCharCode(...b))
.replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
python
import os, base64
id = base64.urlsafe_b64encode(os.urandom(16)).rstrip(b"=").decode()
常见问题
短 UUID 还是 UUID 吗?
严格来说不是。它不再符合 8-4-4-4-12 的写法,因此不能被期望标准 UUID 的系统解析。但随机位是同样可靠的,作为标识符完全够用。
应该选多少字节?
临时值用 8 字节,普通用途用 12 字节,需要和 UUID 同等强度时用 16 字节。8 字节有 64 位随机数,在累计到几十亿个值之前都不会出现实际碰撞。
为什么字符串里会有 - 和 _?
这是 base64url 的字母表,相比标准 base64 的 + 和 /,这两个字符在 URL 和文件名里不需要转义。