UUID Version 4 (ランダム生成)
UUID v4の仕組みを解説。122ビットの乱数による生成方法、衝突確率、そして現代のアプリケーションで最も広く使われている理由を詳しく説明します。
詳細な説明
UUID Version 4は最も広く使われているUUIDのバリアントです。暗号論的に安全な乱数(または擬似乱数)を用いて識別子を生成するため、システム間の調整なしに実質的な一意性が保証されます。
ビットレイアウト(128ビット):
- 122ビットがランダムに生成される
- 4ビットがバージョン番号を示す(v4の場合
0100、ビット48-51に配置) - 2ビットがバリアントを示す(RFC 4122/9562の場合
10、ビット64-65に配置)
つまり、文字列表現ではバージョン桁が常に 4 であり、4番目のグループの最初の16進数字は必ず 8、9、a、b のいずれかになります。例:550e8400-e29b-41d4-a716-446655440000。
122ビットの乱数がなぜ重要か: 2^122(約5.3 x 10^36)個の値が存在するため、衝突確率が50%に達するには約2.71 x 10^18個のUUIDを生成する必要があります(誕生日のパラドックスの閾値)。実用的な観点では、毎秒10億個のUUIDを生成しても、その地点に到達するまで約86年かかります。
JavaScriptでの生成:
// Modern browsers and Node.js 19+
const id = crypto.randomUUID();
// Fallback using crypto.getRandomValues
function uuidv4() {
const bytes = crypto.getRandomValues(new Uint8Array(16));
bytes[6] = (bytes[6] & 0x0f) | 0x40; // version 4
bytes[8] = (bytes[8] & 0x3f) | 0x80; // variant 10
const hex = [...bytes].map(b => b.toString(16).padStart(2, '0')).join('');
return [hex.slice(0,8), hex.slice(8,12), hex.slice(12,16), hex.slice(16,20), hex.slice(20)].join('-');
}
パフォーマンスに関する考慮事項: UUID v4の生成は乱数生成器の呼び出しだけで済むため非常に高速です。ただし、v4 UUIDは完全にランダムなため、データベースのB-treeインデックスにおいてインデックスの局所性が悪化します。挿入が末尾に追加されるのではなくインデックス全体に分散するため、ページ分割が増加し書き込み増幅が大きくなります。インデックス性能が重要な場合は、UUID v7の使用を検討してください。
ユースケース
UUID v4は、セッショントークン、APIリクエストID、共同編集ツールにおけるドキュメント識別子など、中央管理機関が存在しない分散システムで一意な識別子を生成する場合に最適です。