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 より安全(MD5 ではなく SHA-1 を使用)
- 決定論的 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日