如果你做过任何数据库、API 或分布式系统相关的开发,你几乎肯定遇到过 UUID。它们长这样:550e8400-e29b-41d4-a716-446655440000。看起来随机,格式却异常固定,而且无处不在。但它们究竟是什么?为什么有用?又该用哪个版本?我们来一一拆解。
什么是 UUID?
UUID 全称 Universally Unique Identifier(通用唯一标识符),是一种 128 位的标签,用于在计算机系统中唯一标识信息。格式始终相同:32 个十六进制字符,用连字符分为五组,格式为 8-4-4-4-12。
"通用唯一"是它最核心的价值。UUID 的设计保证:任意两个独立生成的 UUID 几乎肯定是不同的——即使在不同机器上同时生成,也无需任何中心协调。这使得 UUID 在分布式系统中极为有用,因为你不需要依赖一个中心节点来分配 ID。
UUID 由 RFC 4122 标准化,几乎所有主流编程语言和数据库系统都原生支持。
UUID 各版本详解
UUID 有多个版本,生成方式各不相同,适用场景也有所区别。最常用的三个版本是 v1、v4 和 v5。
| 版本 | 生成方式 | 唯一性来源 | 可预测? | 典型使用场景 |
|---|---|---|---|---|
| v1 | 时间戳 + MAC 地址 | 时间 + 硬件 | 部分可预测 | 事件日志、审计追踪 |
| v4 | 随机 | 纯随机 | 否 | 通用场景、数据库主键 |
| v5 | 命名空间 + 名称(SHA-1) | 确定性 | 是(相同输入→相同 UUID) | 为已知资源生成一致的 ID |
UUID v1 —— 基于时间戳
v1 UUID 编码了当前时间戳和生成机器的 MAC 地址。它具备时间顺序性,便于排序。但缺点是会泄露信息——通过分析 v1 UUID,可以大致推断出它是何时、在哪里生成的。对于隐私敏感的场景,这是个需要注意的问题。
UUID v4 —— 随机生成
v4 是目前使用最广泛的版本。它由 122 位随机数据生成(另外 6 位用于编码版本和变体)。没有时间戳,没有机器信息,只有随机数据。两个 v4 UUID 发生碰撞的概率低到实际上可以忽略不计。如果不确定用哪个,就用 v4。
UUID v5 —— 基于名称(SHA-1)
v5 通过对命名空间 UUID 和名称字符串进行 SHA-1 哈希来生成 UUID。相同的命名空间 + 名称始终产生相同的 UUID。当你需要为某个已知资源生成一致的、可复现的标识符时,这非常有用——例如,始终为同一个 URL 或邮箱地址生成同一个 UUID。注意:v3 做同样的事,但使用 MD5(现在较少推荐)。
UUID 的常见使用场景
UUID 用途非常广泛,以下是开发者最常使用它的场景:
数据库主键 许多应用使用 UUID 而非自增整数作为主键。优点在于:多台服务器或客户端可以独立创建记录而不产生 ID 冲突,同时也不会通过 ID 暴露数据库中的记录数量。
文件命名与存储 将用户上传的文件存入对象存储(S3、R2 等)时,使用 UUID 作为文件名可以避免冲突,同时不向存储层暴露原始文件名。
Session ID 与令牌 UUID 是很好的 Session 标识符——足够长以至于无法被猜测,又足够简洁以便使用。大多数 Web 框架开箱即用地生成基于 UUID 的 Session 令牌。
分布式事件追踪 在事件驱动或微服务架构中,UUID 被用作关联 ID,在日志和监控系统中追踪一个请求跨多个服务的完整链路。
客户端 ID 生成 在离线优先或移动端应用中,记录可以在设备本地以 UUID 为主键创建,再同步到服务器。无需为了获取 ID 而额外往返服务器。
v4 vs v1 vs v5 —— 该用哪个?
大多数场景的简短答案:
- 用 v4:如果你只需要一个唯一的、不透明的 ID,且不需要它可复现。
- 用 v1:如果你需要按时间排序的 ID,且不在意隐私问题。
- 用 v5:如果你需要从已知的名称或资源中推导出一个一致的 ID。
对于新项目,v4 是安全的默认选择,除非你有特定原因需要选择其他版本。
如何在线生成 UUID
如果你需要一个用于测试、开发或配置的 UUID,不需要写任何代码。ujiffy 的免费 UUID 生成器让你可以:
- 一次生成一个或多个 UUID
- 选择 v1、v4 或 v5 版本
- 即时复制到剪贴板
- 所有操作都在浏览器本地运行——不经过服务器
无需注册,无频率限制,无追踪。
如果你需要在代码中生成 UUID,以下是快速示例:
// JavaScript (浏览器或 Node 14.17+)
crypto.randomUUID() // 生成 v4 UUID
// Python
import uuid
str(uuid.uuid4())
// Go
import "github.com/google/uuid"
uuid.New().String()
但如果你现在就需要一个 UUID,用生成器会更快。
小结
UUID 是软件开发中简单而强大的基础组件。它优雅地解决了"如何在不协调的情况下生成唯一 ID"这个问题。对于大多数应用,v4 已经足够。如果你在构建需要时间排序的日志或已知资源的确定性 ID,v1 或 v5 也各有其适用之处。