UUID 生成器
UUID 生成器
使用UUID生成器快速生成各种版本的唯一标识符,支持批量生成和多种格式输出。
什么是 UUID?
UUID(Universally Unique Identifier,通用唯一标识符)是一个 128 位的数字,用于在计算机系统中唯一标识信息。UUID 也被称为 GUID(Globally Unique Identifier,全局唯一标识符)。
UUID 的特点
- 唯一性:在分布式系统中生成重复 UUID 的概率极低
- 标准化:遵循 RFC 4122 标准
- 跨平台:可在不同操作系统和编程语言中使用
- 无中心化:不需要中央协调机构
UUID 的应用场景
- 数据库主键:作为分布式数据库的主键
- 文件标识:标识文件系统中的文件
- 会话管理:Web 应用中的会话标识
- 消息队列:消息的唯一标识
- API 接口:API 请求和响应的标识
UUID 版本详解
UUID v1(基于时间和节点)
格式:xxxxxxxx-xxxx-1xxx-yxxx-xxxxxxxxxxxx
特点:
- 基于当前时间和节点 ID(通常是 MAC 地址)
- 包含时间戳信息,可以按时间排序
- 可能泄露 MAC 地址信息
生成算法:
// 伪代码示例
function generateUUIDv1() {
const timestamp = Date.now();
const nodeId = getMACAddress();
const clockSeq = random16Bit();
return formatUUID(timestamp, clockSeq, nodeId);
}
UUID v3(基于命名空间和 MD5)
格式:xxxxxxxx-xxxx-3xxx-yxxx-xxxxxxxxxxxx
特点:
- 基于命名空间 UUID 和名称的 MD5 散列
- 相同的命名空间和名称总是产生相同的 UUID
- 适用于需要确定性 UUID 的场景
生成算法:
function generateUUIDv3(namespace, name) {
const namespaceBytes = parseUUID(namespace);
const nameBytes = Buffer.from(name, 'utf8');
const hash = crypto
.createHash('md5')
.update(Buffer.concat([namespaceBytes, nameBytes]))
.digest();
return formatUUIDv3(hash);
}
UUID v4(随机生成)
格式:xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
特点:
- 完全随机生成
- 最常用的 UUID 版本
- 不包含任何有意义的信息
生成算法:
function generateUUIDv4() {
const bytes = crypto.randomBytes(16);
bytes[6] = (bytes[6] & 0x0f) | 0x40; // 版本 4
bytes[8] = (bytes[8] & 0x3f) | 0x80; // 变体
return formatUUID(bytes);
}
UUID v5(基于命名空间和 SHA-1)
格式:xxxxxxxx-xxxx-5xxx-yxxx-xxxxxxxxxxxx
特点:
- 基于命名空间 UUID 和名称的 SHA-1 散列
- 比 v3 更安全(使用 SHA-1 而非 MD5)
- 适用于需要确定性 UUID 的场景
UUID NIL(空 UUID)
格式:00000000-0000-0000-0000-000000000000
特点:
- 所有位都为 0
- 用于表示"无 UUID"或"未知 UUID"
- 在数据库设计中用作默认值
预定义命名空间
标准命名空间 UUID
- DNS 命名空间:
6ba7b810-9dad-11d1-80b4-00c04fd430c8
- URL 命名空间:
6ba7b811-9dad-11d1-80b4-00c04fd430c8
- OID 命名空间:
6ba7b812-9dad-11d1-80b4-00c04fd430c8
- X.500 DN 命名空间:
6ba7b814-9dad-11d1-80b4-00c04fd430c8
使用示例
// 使用 DNS 命名空间生成 UUID v3
const dnsNamespace = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
const uuid = generateUUIDv3(dnsNamespace, 'example.com');
// 结果:5df41881-3aed-3515-88a7-2f4a814cf09e
API 接口
生成单个 UUID
// 生成 UUID v4
const uuid = generateUUID('v4');
// 生成 UUID v1
const uuid = generateUUID('v1');
// 生成 UUID v3
const uuid = generateUUID('v3', {
namespace: '6ba7b810-9dad-11d1-80b4-00c04fd430c8',
name: 'example.com',
});
批量生成 UUID
// 批量生成 UUID
const uuids = generateMultipleUUIDs('v4', 10);
// 生成不同版本的 UUID
const mixedUUIDs = generateMultipleUUIDs(['v1', 'v4', 'v5'], 5);
UUID 验证
// 验证 UUID 格式
const isValid = validateUUID('550e8400-e29b-41d4-a716-446655440000');
// 获取 UUID 版本
const version = getUUIDVersion('550e8400-e29b-41d4-a716-446655440000');
性能考虑
生成速度
- v4(随机):最快,约 100,000 UUID/秒
- v1(时间):中等,约 50,000 UUID/秒
- v3/v5(散列):较慢,约 10,000 UUID/秒
内存使用
- 每个 UUID 占用 16 字节
- 批量生成时注意内存使用量
并发安全
- v4 使用加密安全的随机数生成器
- v1 需要确保时钟序列的唯一性
最佳实践
选择 UUID 版本
- 一般用途:使用 UUID v4
- 需要时间排序:使用 UUID v1
- 需要确定性:使用 UUID v3 或 v5
- 数据库主键:推荐使用 UUID v4
存储优化
-- PostgreSQL 中的 UUID 存储
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name VARCHAR(255)
);
-- 创建索引
CREATE INDEX idx_users_id ON users(id);
性能优化
// 使用对象池减少内存分配
const uuidPool = new Array(1000).fill(null).map(() => generateUUIDv4());
// 批量生成时使用 Web Workers
const worker = new Worker('uuid-worker.js');
worker.postMessage({ type: 'generate', count: 1000 });
常见问题
Q: UUID 和 GUID 有什么区别?
A: UUID 和 GUID 本质上是相同的,只是名称不同。UUID 是 RFC 标准术语,GUID 是 Microsoft 的术语。
Q: UUID 会重复吗?
A: 理论上可能,但概率极低。v4 UUID 重复的概率约为 2.71 × 10^-36。
Q: 如何选择 UUID 版本?
A: 根据需求选择:
- 需要随机性:v4
- 需要时间信息:v1
- 需要确定性:v3 或 v5
Q: UUID 会影响数据库性能吗?
A: 可能影响,因为 UUID 比整数主键大。建议:
- 使用 B-tree 索引
- 考虑使用 UUID v1(时间排序)
- 在适当情况下使用整数主键
相关工具
技术规范
RFC 标准
- RFC 4122:UUID 规范
- RFC 4122 Section 4.1.3:UUID 版本定义
编程语言支持
- JavaScript:
crypto.randomUUID()
(Node.js 14.17+) - Python:
uuid
模块 - Java:
java.util.UUID
- C#:
System.Guid
最后更新时间:2024年1月20日