w

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日

這個頁面對您有幫助嗎?