什么是 UUID
在数据库、微服务、文件系统中,我们需要给每个数据对象一个唯一的"身份证号"。传统做法是用数据库的自增 ID(1, 2, 3, ...),但分布式系统中多个数据库同时插入会导致 ID 冲突。UUID(Universally Unique Identifier,通用唯一标识符)解决了这个问题:
UUID 标准格式(36 字符):
550e8400-e29b-41d4-a716-446655440000
结构:8-4-4-4-12 共 5 段,用连字符分隔
550e8400 - e29b - 41d4 - a716 - 446655440000
时间相关 版本号 变体号 随机部分
UUID 不依赖中央协调器,任何人都可以独立生成,碰撞概率低到可以忽略不计。它的长度固定为 128 位(16 字节),用 32 个十六进制字符 + 4 个连字符表示为 36 字符的字符串。
在线生成 UUID 的步骤
- 打开 UUID 生成器,默认自动生成一个 UUID v4。
- 如需批量生成,设定数量(如 10、50、100),点击生成,一次性获取多个 UUID。
- 可选择格式:标准格式(带连字符)或紧凑格式(去掉连字符),视数据库字段类型而定。
- 点击「复制」一键复制单个,或「导出全部」将列表保存为文本或 CSV。
所有 UUID 在浏览器本地使用密码学安全随机数生成,质量与后端标准库一致。
核心功能一览
UUID v4 生成
基于 crypto.getRandomValues() 的纯随机 UUID,业界最常用版本。
批量生成
一键生成 1-500 个 UUID,适合批量数据填充和测试场景。
多格式输出
支持标准格式(带连字符)和紧凑格式(去连字符),适配不同数据库需求。
纯本地运行
完全在浏览器中生成,不联网,生成的 UUID 不会被记录或泄露。
UUID v1 vs v4 vs v7:选哪个版本
| 版本 | 生成方式 | 特点 | 推荐场景 |
|---|---|---|---|
| v1 | MAC 地址 + 时间戳 | 可追溯生成机器,但暴露隐私 | 不推荐(已被 v4/v7 取代) |
| v4 | 纯随机数(122 bit) | 最简单通用,无序 | 通用 Web 应用、文件标识 |
| v7 | 时间戳 + 随机数 | 按时间排序,数据库索引友好 | 数据库主键、日志、事件流 |
UUID vs 自增 ID:怎么选
| 维度 | UUID | 自增 ID (AUTO_INCREMENT) |
|---|---|---|
| 存储空间 | 16 字节(128 bit) | 4-8 字节 |
| 分布式友好 | 天然支持,不会冲突 | 多库合并时需额外处理 |
| 信息安全 | 不暴露数据量和创建顺序 | 可推算用户数、订单量 |
| 索引性能 | v4 乱序 → B+Tree 碎片;v7 有序 → 改善 | 有序,索引效率高 |
| URL 美观 | /user/550e8400-e29b-41d4-a716-... | /user/42 简洁 |
常见应用场景
- 数据库主键:分布式数据库(如 CockroachDB、TiDB)和多实例 MySQL 中,用 UUID 替代自增 ID 避免主键冲突。
- 文件命名:上传文件时用 UUID 重命名,避免用户上传同名文件互相覆盖。
- API 资源标识:RESTful API 中用 UUID 作为资源 ID,避免暴露自增 ID 带来的安全风险。
- 事务追踪:在微服务链路中为每个请求生成 UUID 作为 Trace ID,串联所有日志。
- 测试数据:开发测试时需要大量不重复的 ID、订单号、用户名,批量 UUID 生成快速填充。
常见问题 FAQ
UUID 真的不会重复吗?
UUID v4 使用 122 位密码学安全随机数,可能的组合数量约 5.3×10³⁶(5.3 后面跟 36 个零)。理论上有极微小的碰撞可能性,但实际中即使全球每秒生成数十亿个 UUID,也需要数万亿年才可能撞一次。对于绝大多数应用场景,碰撞概率远低于硬件故障和软件 bug 导致的数据错误,可以忽略。
UUID v1、v4、v7 该选哪个?
v4(纯随机)最通用、最简单,是事实上的默认选择。v1 基于 MAC 地址和时间戳,从隐私和安全性角度已经不推荐。v7 是 2024 年标准化的较新版本,前 48 位是毫秒时间戳,使 UUID 整体有序,对数据库 B+Tree 索引更友好。如果你的数据库使用 UUID 做主键且数据量大,推荐用 v7。
UUID 和自增 ID 哪个更适合做主键?
各有优劣:自增 ID 占用空间小、索引连续有序效率高,但分布式系统中多数据库同时写入会冲突,且会暴露数据量(如 /user/1001 让人猜到你是第几个用户)。UUID 全局唯一、不暴露业务信息,但占 16 字节且 v4 的乱序插入可能导致 B+Tree 页分裂。如果选 UUID,优先考虑 v7 以获得有序性。
在线生成的 UUID 可以用于生产环境吗?
速工具 使用浏览器的 crypto.getRandomValues() API,其随机数质量与 Node.js 的 crypto.randomUUID() 和 Python 的 uuid.uuid4() 相当。但在生产代码中,建议直接用编程语言的标准库函数生成 UUID——性能更好且不依赖外部工具。在线工具更适合开发调试和临时使用。