ゆるテックノート

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タイムで確認できます。

仕様と出典

RFC 9562: UUIDs (§4, §5, §6, §8)