什么是 UUID?
UUID(Universally Unique Identifier,通用唯一标识符)是一个 128 位的数字,通常以 32 个十六进制字符加 4 个连字符的格式表示:
550e8400-e29b-41d4-a716-446655440000
^^^^^^^^ ^^^^ ^^^^ ^^^^ ^^^^^^^^^^^^
time time ver var node
UUID 的设计目标是在不依赖中央服务器的情况下,在分布式系统中生成全局唯一的 ID。
UUID 的主要版本
| 版本 | 生成方式 | 特点 | 推荐场景 |
| UUID v1 | 基于时间戳 + MAC 地址 | 可追溯生成时间,但暴露 MAC 地址 | 需要时间排序的场景 |
| UUID v4 | 完全随机 | 最常用,简单,无规律 | 数据库主键、会话 ID(默认选择) |
| UUID v5 | 基于命名空间 + SHA-1 哈希 | 相同输入生成相同 UUID(确定性) | 内容寻址、去重 |
| UUID v7 | 基于 Unix 时间戳(毫秒)+ 随机 | 时间有序,适合数据库索引 | 新项目数据库主键(推荐) |
如何在线生成 UUID
使用 tool.tl UUID 生成器:
- 打开 tool.tl/uuid-generator
- 选择 UUID 版本(推荐 v4 或 v7)
- 设置生成数量(1 到 100 个)
- 点击「生成」
- 复制单个或批量复制所有 UUID
UUID 碰撞概率有多低?
UUID v4 有 122 位随机性,碰撞概率极低:
- 生成 10 亿个 UUID,碰撞概率约为 1 in 5.3 × 10²⁰
- 每秒生成 10 亿个 UUID,需要约 850 年才有 50% 的概率出现一次碰撞
在实际工程中,UUID v4 碰撞是无需担心的问题。
UUID vs 其他 ID 方案对比
| 方案 | 示例 | 优点 | 缺点 |
| UUID v4 | 550e8400-... | 无需服务器、真随机 | 无顺序,索引性能稍差 |
| UUID v7 | 018f7d3a-... | 时间有序,索引友好 | 泄露生成时间 |
| 自增整数 | 1, 2, 3... | 简单、索引性能最好 | 依赖数据库,分布式不适用 |
| 雪花 ID(Snowflake) | 7061564869888 | 时间有序,高并发 | 需要机器 ID 配置 |
| ULID | 01ARZ3NDEKTSV4... | 时间有序,Base32 编码更短 | 相对较新 |
各语言生成 UUID
# Python (3.3+)
import uuid
print(uuid.uuid4()) # v4
print(uuid.uuid1()) # v1
// JavaScript / Node.js (18+)
import { randomUUID } from 'crypto';
console.log(randomUUID()); // v4
// 浏览器
console.log(crypto.randomUUID()); // v4
-- SQL (PostgreSQL)
SELECT gen_random_uuid(); -- v4
-- MySQL 8.0+
SELECT UUID();
常见问题(FAQ)
Q:UUID 和 GUID 有什么区别?
A:GUID(Globally Unique Identifier)是微软对 UUID 规范的实现,两者在格式和使用上基本相同,可以认为是同一个东西。
Q:UUID 适合做数据库主键吗?
A:UUID v4 可以做主键,但因为随机性会导致 B-Tree 索引频繁页分裂,写入性能比自增 ID 差。推荐使用时间有序的 UUID v7 或 ULID,在保持唯一性的同时改善索引性能。
Q:UUID 是否区分大小写?
A:UUID 的十六进制字符大小写等价(RFC 4122 规定小写,但大写也合法)。存储和比较时应统一格式。