UUIDとは?
UUID(Universally Unique Identifier)は128ビット、つまり16バイトの識別子です。複数の場所でIDを発行しやすく、注文・メッセージ・DBの行などを区別するために使われます。値の作り方はバージョンによって異なります。
UUIDの概要
中央の採番サーバーに毎回問い合わせずに発行できるのが強みです。ただし、UUIDという名前だけで重複が絶対に起きないと考えるのは禁物です。
基本の表記
- 通常は16進数32桁とハイフン4個で、合計36文字です。区切りは8-4-4-4-12桁です。
- 英字の大文字・小文字は同じ値を表します。128ビットは値そのものの大きさであり、36文字の文字列保存サイズとは区別します。
- 現在のUUID仕様はRFC 9562です。以前のRFC 4122を置き換え、v6・v7・v8も定義しています。
UUIDv4の表記例
第3ブロックは4で始まり、第4ブロックはバリアントを示すaで始まっています。これは読み方を示す固定例です。
1f593de9-8f62-4c48-a8c3-123456789abc
構造とビット配置
以下はRFC 9562のバリアントに属する通常のUUIDの見方です。各ブロックの残りの内容は、時刻・乱数・ハッシュなど、バージョンによって変わります。
5つのブロック
| 位置 | 長さ | 読み方 |
|---|---|---|
| 第1 | 32 bit | 16進数8桁 |
| 第2 | 16 bit | 16進数4桁 |
| 第3 | 16 bit | 先頭4ビットがバージョン |
| 第4 | 16 bit | 先頭2ビットがバリアント10 |
| 第5 | 48 bit | 16進数12桁 |
バージョンとバリアントを読む
- バージョンは第3ブロックの先頭、つまり2個目のハイフンの直後です。4ならv4、7ならv7です。
- このバリアントでは第4ブロック先頭の16進1桁が8・9・a・bのいずれかです。その上位2ビットが10になります。
- 全ビット0のNil、全ビット1のMaxは特別なUUIDです。許可するバージョンや特別値は、利用するAPIの仕様に合わせます。
主なバージョンと違い
何を元にIDを作るかで、時刻の露出や再現性が変わります。
代表的な4種類
| 版 | 生成方法 | 選ぶときの注意 |
|---|---|---|
| v1 | 時刻・クロックシーケンス・ノード値 | MACアドレスを含む実装があり、単純な文字列順は時刻順にならない |
| v4 | 122ビットの乱数 | 時刻を埋め込まず、生成順には並ばない |
| v5 | 名前空間と名前のSHA-1ハッシュ | 同じ名前空間と同じ名前のバイト列なら同じ値 |
| v7 | 先頭にUnix時刻(ミリ秒) | 時刻で並べやすいが、生成時刻を読み取れる |
用途に合わせて選ぶ
- 時刻を含めないランダムIDにはv4、時刻に近い順での格納にはv7が候補です。v7でも全端末の厳密な処理順は保証できません。
- 同じ入力を同じIDへ対応させたい場合はv5が候補です。名前空間、文字コード、表記の正規化を共有します。v5は秘密のトークンや改ざん検出用の署名ではありません。
- v1互換が必要なら、時刻やノード値の扱いを調べます。ULID・KSUIDは別形式なので、UUID必須の入力へそのまま渡せません。比較はUUIDの実務Tipsを参照してください。
生成時の注意点
実装済みのライブラリを使い、用途に合うバージョンを明示します。
ライブラリの動作を確認する
- v4など乱数を使う方式では、暗号学的に安全な乱数生成器を使う実装を選びます。
- v1のランダムノードはMACアドレスの露出を避けますが、時刻は隠しません。
- v7では、同じミリ秒の連続生成や時計の巻き戻りの扱いを確認します。残り74ビットの一部にカウンターなどを使う実装もあります。
件数に応じた衝突リスク
独立・均一なv4の特定の2個が一致する確率は1 / 2^122です。n個全体で少なくとも1組が重複する確率は、十分小さい範囲で約n(n−1) / (2 × 2^122)。10億個なら約9.4 × 10^-20です。件数別の計算とあわせ、DBのユニーク制約で検出し再生成する処理を設計します。
よくある用途
UUIDは「どのデータか」を示す名前として使います。
利用例と権限
- 注文ID、メッセージID、ログを結び付ける相関IDなど。
- クライアントで発行したUUIDを受け付ける場合も、入力検証と保存時の重複検出が必要です。
- URLにUUIDを使ってもアクセス権は生まれません。閲覧・更新のたびに認可を確認します。セッショントークンには、その用途に設計された仕組みを使います。
保管・運用のポイント
保存形式と入出力の約束をそろえると、システム間の比較が容易になります。
保存と比較をそろえる
- DBのUUID専用型、16バイトのバイナリ、文字列から選びます。性能は索引やクエリによって異なるため、形式名だけで決めません。
- バイナリ化ではバイト順をそろえます。文字列では小文字など表記を統一して扱えます。
- URLを短くするための符号化は128ビットを復元できる方式にします。文字を途中で削る方法とは異なります。
- 実行できる生成例や保存の注意はUUIDの実務Tips、時刻の意味はUnixタイムで確認できます。