w

UUID 生成器

UUID 生成器

使用UUID生成器快速生成各种版本的唯一标识符,支持批量生成和多种格式输出。

什么是 UUID?

UUID(Universally Unique Identifier,通用唯一标识符)是一个 128 位的数字,用于在计算机系统中唯一标识信息。UUID 也被称为 GUID(Globally Unique Identifier,全局唯一标识符)。

UUID 的特点

  • 唯一性:在分布式系统中生成重复 UUID 的概率极低
  • 标准化:遵循 RFC 4122 标准
  • 跨平台:可在不同操作系统和编程语言中使用
  • 无中心化:不需要中央协调机构

UUID 的应用场景

  1. 数据库主键:作为分布式数据库的主键
  2. 文件标识:标识文件系统中的文件
  3. 会话管理:Web 应用中的会话标识
  4. 消息队列:消息的唯一标识
  5. 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 版本

  1. 一般用途:使用 UUID v4
  2. 需要时间排序:使用 UUID v1
  3. 需要确定性:使用 UUID v3 或 v5
  4. 数据库主键:推荐使用 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 版本定义

编程语言支持

  • JavaScriptcrypto.randomUUID()(Node.js 14.17+)
  • Pythonuuid 模块
  • Javajava.util.UUID
  • C#System.Guid

最后更新时间:2024年1月20日

Was this page helpful?