什么是 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 的步骤

  1. 打开 UUID 生成器,默认自动生成一个 UUID v4。
  2. 如需批量生成,设定数量(如 10、50、100),点击生成,一次性获取多个 UUID。
  3. 可选择格式:标准格式(带连字符)或紧凑格式(去掉连字符),视数据库字段类型而定。
  4. 点击「复制」一键复制单个,或「导出全部」将列表保存为文本或 CSV。

所有 UUID 在浏览器本地使用密码学安全随机数生成,质量与后端标准库一致。

核心功能一览

UUID v4 生成

基于 crypto.getRandomValues() 的纯随机 UUID,业界最常用版本。

批量生成

一键生成 1-500 个 UUID,适合批量数据填充和测试场景。

多格式输出

支持标准格式(带连字符)和紧凑格式(去连字符),适配不同数据库需求。

纯本地运行

完全在浏览器中生成,不联网,生成的 UUID 不会被记录或泄露。

UUID v1 vs v4 vs v7:选哪个版本

版本生成方式特点推荐场景
v1MAC 地址 + 时间戳可追溯生成机器,但暴露隐私不推荐(已被 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——性能更好且不依赖外部工具。在线工具更适合开发调试和临时使用。