UUID 生成器:什么是 UUID 以及何时使用
了解 UUID 版本(v1、v4、v5、v7),何时使用它们,以及如何在浏览器或编程语言中生成 UUID。
什么是 UUID?
UUID(通用唯一标识符)是计算机系统中用于标识信息的 128 位数字。通常写作 36 个字符的字符串,如 550e8400-e29b-41d4-a716-446655440000,UUID 的设计目标是在不需要中央协调机构的情况下实现全局唯一性。
两个独立生成的 UUID 发生冲突的概率极低——对于 v4,你需要每秒生成 10 亿个 UUID 持续 85 年才有 50% 的概率出现一次冲突。我们的 UUID 生成器 在浏览器中即时创建它们。
UUID 版本详解
UUID v1 — 基于时间戳
v1 UUID 结合了时间戳和生成机器的 MAC 地址。这保证了唯一性(同一机器 + 同一时间 = 同一 UUID),但会泄露 UUID 的创建时间和地点信息。
格式: xxxxxxxx-xxxx-1xxx-xxxx-xxxxxxxxxxxx
示例: 550e8400-e29b-11d4-a716-446655440000
UUID v4 — 随机
v4 是最常用的版本。它由随机数生成,122 位随机性加上 6 位固定的版本和变体标识。简单、快速且无隐私顾虑。
格式: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
示例: f47ac10b-58cc-4372-a567-0e02b2c3d479
^版本 ^变体 (8, 9, a, b)
UUID v5 — 基于名称(SHA-1)
v5 通过 SHA-1 哈希从命名空间和名称生成 UUID。相同的命名空间 + 名称始终产生相同的 UUID——确定性和可复现。
# Python: 生成 UUID v5
import uuid
namespace = uuid.NAMESPACE_DNS
print(uuid.uuid5(namespace, "example.com"))
# 始终返回: cfbff0d1-9375-5685-968c-48ce8b15ae17
UUID v7 — 时间戳 + 随机(新版)
v7(RFC 9562)结合了 Unix 时间戳和随机位。它按创建时间排序同时保持随机性——v1 和 v4 的最佳结合。作为数据库主键的推荐选择越来越多。
格式: xxxxxxxx-xxxx-7xxx-xxxx-xxxxxxxxxxxx
结构: 48 位时间戳 | 12 位随机 | 版本 | 62 位随机
何时使用 UUID
- 数据库主键:避免暴露记录数量的自增 ID。UUID 允许客户端在插入前生成 ID。
- 分布式系统:多个节点可以独立生成 ID,无需协调。
- API 资源:暴露 UUID 而非自增整数,防止枚举攻击。
- 会话令牌:用于用户会话的唯一、不可猜测的标识符。
- 文件命名:防止多个进程同时写入文件时发生冲突。
UUID vs 其他 ID 系统
UUID vs 自增 ID
自增整数快速且紧凑,但会泄露信息(总记录数、创建顺序),并且需要中央数据库协调。UUID 用大小换取去中心化。
UUID vs ULID
ULID 是 128 位 ID,前 48 位编码时间戳,使其可以按字典序排序。比 v4 UUID 更适合数据库,但标准化程度较低。UUID v7 在 UUID 标准内解决了同样的问题。
UUID vs NanoID
NanoID 生成更短、URL 友好的标识符(默认 21 个字符),但不是标准。适合面向用户的 URL;对于系统级标识,还是用 UUID。
不同语言中生成 UUID
// JavaScript (Node.js)
const crypto = require('crypto');
const uuid = crypto.randomUUID();
console.log(uuid); // 如: 1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed
// 浏览器
const uuid = self.crypto.randomUUID();
# Python
import uuid
print(uuid.uuid4()) # 随机 UUID
print(uuid.uuid5(uuid.NAMESPACE_DNS, "example.com")) # 基于名称
# 命令行
uuidgen # macOS / Linux
cat /proc/sys/kernel/random/uuid # Linux 备选方案
高效存储 UUID
UUID 作为字符串占用 36 字节。以二进制存储(16 字节)可节省空间但使调试复杂化。现代数据库提供原生 UUID 类型,自动处理这个问题。
// PostgreSQL: 原生 UUID 类型
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name TEXT NOT NULL
);
常见问题
UUID 真的永远不会冲突吗?
概率非零但极其微小。对于 v4,你需要生成约 2.71 × 10¹⁸ 个 UUID 才有 50% 的概率出现一次冲突。实际应用中,它们是唯一的。
应该使用哪个 UUID 版本?
简单场景用 v4,需要排序用 v7,需要确定性生成用 v5。大多数情况下 v4 是默认选择。
在 URL 中暴露 UUID 安全吗?
安全——v4 UUID 不泄露系统或序列的任何信息。这是相对于自增整数 ID 的主要优势。
如何在不安装任何东西的情况下生成 UUID?
使用我们的 UUID 生成器——完全在浏览器中运行,支持 v1、v4、v5 和 v7 格式。
总结
UUID 解决了分布式系统中无需协调生成唯一标识符的问题。无论你需要随机(v4)、时间可排序(v7)还是确定性(v5)标识符,我们的 UUID 生成器 都能满足——支持批量生成和多种格式选项,全部在客户端完成。
试试这个工具?
打开工具 →