15分で読めます

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-446655440000
↑ version digit (4 = random)↑ variant bits (a = RFC 4122/9562系)

UUIDの形式と構造

UUIDは32個の16進数を、ハイフンで5つのグループに分けた8-4-4-4-12形式で表します。文字列表現は36文字ですが、内部的には常に128ビット、つまり16バイトです。

例の13桁目にはUUIDのバージョンが入り、v4なら必ず4になります。17桁目付近にはvariant情報が入り、標準的なUUIDでは89abのいずれかになります。

UUIDバージョン比較

UUIDには複数のバージョンがあり、ランダム性、決定性、時系列順、プライバシーの性質が異なります。

バージョン生成方法特徴
v1時刻 + MACアドレス一部時系列順に並ぶが、MACアドレスに由来するプライバシー懸念がある
v3Namespace + name + MD5同じ入力から同じUUIDを生成できるが、古いMD5を使う
v4122ビットのランダム値最も一般的。分散生成に向くが、完全ランダムなのでDBインデックスでは散らばりやすい
v5Namespace + name + SHA-1同じ入力から同じUUIDを生成する決定的IDに向く
v6v1を時系列順に並びやすくした形式時系列順が必要なシステム向けだが、v1由来の性質がある
v7Unix timestamp + random bits新しいシステムやDB向け。時間順に並び、標準UUIDとして扱える
Nil00000000-0000-0000-0000-000000000000nullや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