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日