UUID v1 v4 v7 の違いと選び方
UUIDの主要バージョンv1(時刻とノードフィールド)、v4(乱数)、v7(時刻情報を含む)の特徴と、実装・セキュリティ上の選択ポイントを解説します。
公開 · 更新 · yuzlrin
主要バージョンの性質
・v1: 時刻 + ノードフィールド。実装によってMACアドレスが使われる場合はノード情報を露出することがあります。
・v3: 名前ベースMD5ハッシュ。名前空間と名前が同じなら同じUUIDになります。
・v4: 122 bitの乱数フィールドを持ちます。衝突しない保証はなく、乱数生成器と利用条件を考慮します。
・v5: 名前ベースSHA-1ハッシュ。
・v7: 48 bit Unix time + 74 bitの残りフィールド。実装は乱数や単調増加カウンター等を用いて生成し、時刻順に近い並びになります。
DB インデックスでの v4 vs v7
PostgreSQL / MySQL の B-Tree インデックスは insert 順が連続的だとページ分割が少なく高速。v4 はランダムなので INSERT が散乱し、v7 は時刻プレフィックスで昇順に近く INSERT 効率が上がります。
v7は時刻順に近い挿入順を作りやすい一方、性能差はデータベース、インデックス、並行度、生成器等で変わります。実際のワークロードで測定してください。
セキュリティ上の注意
v1は時刻とノードフィールドを含みます。ノードにMACアドレスを使用する実装ではノード情報を露出することがありますが、乱数のノードIDも認められており、発行者を必ず特定できるわけではありません。
v7 は時刻情報を露出するため、おおよその生成時刻が推測される場合があります。識別子を秘密や認可手段として扱わず、アクセス制御を別途実装してください。HMACはメッセージ認証コードであり暗号化ではないため、隠蔽が必要なら適切な暗号方式を選びます。
関連ツール
よくある質問
UUID の衝突確率は?
v4には122 bitの乱数フィールドがあります。衝突確率は生成数と乱数の品質に依存し、誕生日近似で見積もれます。乱数生成器・重複検査など実装条件も含めて設計してください。
ULID との違いは?
ULIDは48 bit時刻と80 bitの乱数部を26文字のCrockford Base32で表します。UUID v7とは形式・順序づけ・実装の仕様が異なるため、既存システムや要件に合わせて選択してください。
短縮 UUID は使っていい?
URL で見栄え優先なら Base62 / Base64url に短縮可。ただし短縮後の衝突耐性を必ず計算すること。8 桁 Base62 は 2.18 × 10^14 通りで、数億レコードの一意性は確保できません。
出典・参考資料
本文は上記資料を参考にした解説です。仕様やサービスの運用は変更されることがあるため、実際の利用時は公式資料も確認してください。