UUIDとは?Universally Unique Identifierをv1、v4、v5、v7まで解説
データベースの主キーからAPIのリソースIDまで、UUIDは分散システムで一意な識別子を作るための定番です。仕組み、バージョンごとの違い、衝突確率、実務での選び方を整理します。
目次
UUIDとは?
UUID (Universally Unique Identifier) は、コンピューターシステム内の情報を一意に識別するための128ビットの値です。Microsoft系の文脈ではGUIDとも呼ばれます。
UUIDの大きな利点は、中央の採番サーバーに問い合わせなくても、複数のアプリケーションやサーバーがそれぞれIDを生成できることです。そのため、マイクロサービス、オフライン同期、分散データベース、API設計でよく使われます。
550e8400-e29b-41d4-a716-446655440000UUIDの形式と構造
UUIDは32個の16進数を、ハイフンで5つのグループに分けた8-4-4-4-12形式で表します。文字列表現は36文字ですが、内部的には常に128ビット、つまり16バイトです。
例の13桁目にはUUIDのバージョンが入り、v4なら必ず4になります。17桁目付近にはvariant情報が入り、標準的なUUIDでは8、9、a、bのいずれかになります。
UUIDバージョン比較
UUIDには複数のバージョンがあり、ランダム性、決定性、時系列順、プライバシーの性質が異なります。
| バージョン | 生成方法 | 特徴 |
|---|---|---|
| v1 | 時刻 + MACアドレス | 一部時系列順に並ぶが、MACアドレスに由来するプライバシー懸念がある |
| v3 | Namespace + name + MD5 | 同じ入力から同じUUIDを生成できるが、古いMD5を使う |
| v4 | 122ビットのランダム値 | 最も一般的。分散生成に向くが、完全ランダムなのでDBインデックスでは散らばりやすい |
| v5 | Namespace + name + SHA-1 | 同じ入力から同じUUIDを生成する決定的IDに向く |
| v6 | v1を時系列順に並びやすくした形式 | 時系列順が必要なシステム向けだが、v1由来の性質がある |
| v7 | Unix timestamp + random bits | 新しいシステムやDB向け。時間順に並び、標準UUIDとして扱える |
| Nil | 00000000-0000-0000-0000-000000000000 | nullやsentinel値として使うことがある |
UUID v4の仕組み
UUID v4は、128ビットのうちversionとvariantに使うビットを除いた122ビットをランダム値で埋めます。ブラウザやNode.jsでは、暗号学的に安全な乱数生成器を使うcrypto.randomUUID()が代表的です。
実務ではv4がもっとも広く使われます。採番サーバーが不要で、複数のサービスが同時にIDを作っても衝突しにくいからです。一方、完全にランダムな値なので、データベースのB-treeインデックスでは挿入位置が散らばりやすい点に注意します。
UUIDの衝突確率
UUID v4の値空間は非常に大きく、適切な乱数生成器を使えば衝突確率は実用上ほぼ無視できます。ただし「絶対に衝突しない」わけではありません。乱数生成器の品質が低い、値を短く切り詰める、同じシードを使い回す、といった実装ミスではリスクが上がります。
大量生成するシステムでは、CSPRNGを使うこと、DB側でunique constraintを張ること、失敗時に再生成することをセットで考えるのが堅実です。
データベースでのUUID
UUIDは外部公開するIDや分散生成する主キーに向いています。連番IDのようにレコード数や作成順を推測されにくく、複数システム間でIDを事前に発行しやすいからです。
ただし、文字列として保存すると容量が増えます。PostgreSQLのuuid型や、MySQLのBINARY(16)のようなネイティブまたはバイナリ表現を使うと効率的です。書き込み性能を重視するなら、時系列順に並びやすいUUID v7も有力です。
UUIDとAuto-Increment、ULID、Snowflakeの比較
| 方式 | 強み | 注意点 |
|---|---|---|
| Auto-increment integer | 短く読みやすく、インデックス性能が高い | 中央のsequenceが必要で、推測されやすく分散生成に弱い |
| UUID v4 | 分散生成でき、順序や件数を漏らしにくい | ランダムなためDBインデックスが断片化しやすい |
| UUID v7 | 標準UUIDでありながら時間順に並びやすい | v4より新しいため、ライブラリやDB対応を確認する必要がある |
| ULID | 短くURLフレンドリーで時間順に並べられる | UUID標準ではなく、ツール対応がUUIDより少ないことがある |
| Snowflake ID | 短い64ビットIDで大規模・時系列用途に強い | worker IDや時計ずれの管理が必要 |
UUIDの実用例
- データベースの主キーや外部公開用ID
- REST APIやGraphQLのリソース識別子
- マイクロサービス間で共有するイベントID、メッセージID、trace ID
- オブジェクトストレージのファイル名やアップロードID
- 同じ入力から同じIDを作りたい場合のUUID v5
UUID v7とUUIDの今後
RFC 9562で標準化されたUUID v7は、Unix timestampとランダムビットを組み合わせた形式です。標準UUIDの互換性を保ちながら時間順に並びやすいため、ログ、イベント、データベース主キーのような用途で採用しやすくなっています。
新しいプロジェクトで「UUIDとして扱いたいが、インデックス性能や時系列ソートも欲しい」場合は、v4だけでなくv7のライブラリ対応を確認する価値があります。
ベストプラクティス
- 一般用途ではUUID v4、時系列順が重要ならUUID v7を検討する。
- 乱数生成には
Math.random()ではなくCSPRNGを使う。 - DBではネイティブのUUID型または16バイト表現を使い、unique constraintを張る。
- UUIDをパスワードやアクセストークンの代わりにしない。UUIDは識別子であって秘密情報ではない。
- 表示を短くしたいだけでUUIDを安易に切り詰めない。衝突確率が急に上がる。
UUIDをすぐに生成
テストデータ、API設計、データベースの検証には、ブラウザ上でUUIDをすばやく生成できます。
UUID Generatorを開く参考資料
- RFC 9562 - Universally Unique IDentifiers (UUIDs)
- RFC 4122 - A Universally Unique IDentifier (UUID) URN Namespace
- PostgreSQL uuid type、MySQL UUID storage best practices