Developer Tools
UUID 详解:何时使用以及工作原理
了解什么是 UUID、各版本之间的区别、碰撞风险,以及如何为数据库和 API 安全地生成 UUID。
7分钟阅读
UUID(通用唯一标识符)是一个 128 位的标签,通常写作 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx。开发者将 UUID 用作主键、关联 ID 和不透明令牌,因为它们无需中央协调器即可生成,且发生碰撞的概率极低。
为什么不直接使用整数?
自增整数简单紧凑,但会泄露信息:竞争对手可以猜测你有多少订单,或通过遍历 ID 来抓取资源。UUID 在实际使用中是不可猜测的,可以安全地暴露在 URL 和客户端代码中。
UUID 本身并不是一种安全特性。如果需要授权控制,仍然要在服务器端强制执行。
常见 UUID 版本
| 版本 | 生成方式 | 典型用途 |
|---|---|---|
| v1 | MAC 地址 + 时间戳 | 遗留系统;若注重隐私请避免使用 |
| v4 | 随机位 | 新系统的默认选择 |
| v5 | 命名空间 + 名称的 SHA-1 哈希 | 从稳定输入生成确定性 ID |
如今大多数应用使用 UUID v4 作为主键。部分团队偏好使用 ULID 或 Snowflake ID 以获得可按时间排序的字符串;UUID 仍是支持最广泛的方案。
碰撞概率
使用 v4 时,在每秒生成数十亿个 ID 之前,碰撞的概率极低。对于普通的 Web 应用,将碰撞视为不可能发生是合理的——只要你的随机数来源具有密码学强度(使用操作系统或语言的 CSPRNG,而非 Math.random() 来生成安全敏感的 ID)。
// 浏览器:优先使用 crypto.randomUUID()(如果可用)
const id = crypto.randomUUID();
console.log(id); // 例如:9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d
实用建议
- 数据库索引:随机 UUID 比顺序 ID 更容易导致 B 树索引碎片化。如果在超大规模下插入性能至关重要,可以考虑 PostgreSQL 的
gen_random_uuid()、UUID v7(按时间排序)或 COMB 风格的技巧。 - 日志与追踪:为每个请求生成一个 UUID 作为关联 ID,便于跨服务检索日志。
- 测试:在测试夹具中生成新的 UUID,避免测试依赖固定值——除非需要可复现性(此时 v5 或带种子的生成器可能更合适)。
在浏览器中试用
使用我们免费的 UUID Generator,即可立即生成 v4 风格的标识符——无需注册,所有操作均在本地标签页中运行。
如需相关工具,你可能还会用到 Hash Generator(用于生成校验和)以及 JWT Decoder(用于调试 API 中常与 UUID 配合使用的令牌)。