什么是 UUID?
UUID(通用唯一标识符)是一个 128 位的标识符,保证在所有空间和时间上都是唯一的。UUID 表示为 32 个十六进制数字,以 8-4-4-4-12 的格式分成五组,用连字符分隔。
快速了解
| 全称 | 通用唯一标识符 |
|---|---|
| 创建时间 | 1980 年代(2005 年在 RFC 4122 中标准化) |
| 规范文档 | 官方规范 |
工作原理
UUID 使用结合各种唯一性来源(如时间戳、随机数和硬件地址)的算法生成。有几个版本:版本 1 使用时间戳和 MAC 地址,版本 4 使用随机数(最常用),版本 5 使用命名空间和名称进行 SHA-1 哈希。生成重复 UUID 的概率极低,在实际应用中被认为是不可能的。UUID 广泛用于需要唯一标识符但无需中央协调的分布式系统中。
主要特点
- 128 位长度,提供 2^128 种可能的值
- 标准化格式:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
- 多个版本适用于不同用例(v1、v4、v5 等)
- 可以在没有中央权威的情况下生成
- 碰撞概率在实际应用中可以忽略不计
- 不区分大小写(大写和小写等效)
常见用途
- 分布式系统中的数据库主键
- Web 应用中的会话标识符
- 文件和资源命名
- 微服务中的事务 ID
- 设备标识
示例
Loading code...常见问题
UUID 和 GUID 有什么区别?
UUID(通用唯一标识符)和 GUID(全局唯一标识符)本质上是同一个东西 - 都是具有相同格式的 128 位标识符。GUID 是 Microsoft 在 Windows 和 .NET 中使用的术语,而 UUID 是在大多数其他上下文和官方 RFC 规范中使用的术语。它们完全兼容且可互换。
应该使用哪个 UUID 版本?
UUID v4(随机)是最常用的,由于其简单性和强唯一性,推荐用于一般用途。UUID v7(时间排序)非常适合数据库主键,因为它保持时间顺序并提高索引性能。UUID v1(时间戳 + MAC 地址)会暴露机器信息,所以现在不太常用。UUID v5 用于从命名空间和名称确定性生成。
UUID 碰撞真的会发生吗?
虽然理论上可能,但 UUID v4 碰撞实际上是不可能的。有 122 个随机位,你需要生成约 2.71 百亿亿个 UUID 才有 50% 的碰撞概率。换个角度看,每秒生成 10 亿个 UUID 需要约 85 年才能达到这个概率。在所有实际用途中,UUID 可以被认为是唯一的。
如何在不同编程语言中生成 UUID?
在 JavaScript 中:crypto.randomUUID() 或使用「uuid」npm 包。在 Python 中:import uuid; uuid.uuid4()。在 Java 中:UUID.randomUUID()。在 PHP 中:使用 Ramsey\Uuid\Uuid 或简单需求用 uniqid()。在 C# 中:Guid.NewGuid()。在 Go 中:使用 google/uuid 包。大多数现代语言都有内置或标准库支持 UUID 生成。
数据库主键应该使用 UUID 还是自增 ID?
两者都有权衡。UUID 更适合分布式系统(无需协调)、数据合并和安全性(ID 不可猜测)。自增 ID 空间效率更高、人类可读,且在 B 树索引中性能更好。UUID v7 通过时间排序提供了中间方案,具有更好的索引性能。对于分布式系统考虑使用 UUID,对于单数据库应用程序使用自增 ID。