UUID v4とv7:ランダムIDか、時系列順のIDか
UUID v4とv7のガイド
UUID v4とv7(GUIDとUUIDの違いも):どれを使うべきか | We.Inc
RFC 9562におけるUUID v7とv4の違い、時系列順のIDがデータベースのキーに向く理由、GUIDとは何かを解説します。ブラウザーでv4とv7のIDを生成し、v7のタイムスタンプを解読するツール付きです。
どちらも36文字で表記される128ビットの識別子です。v4のUUIDは122ビットのランダム値なので、新しい値はソート済みインデックスのどこにでも入ります。v7のUUIDはミリ秒単位の48ビットUnixタイムスタンプで始まり、その後にランダムなビットが続くため、値はおおよそ作成順に並びます。RFC 9562は、古い時刻ベースのv1やv6よりv7を推奨しています。
v4とv7の比較
- 構成
- 122ビットのランダム値
- 48ビットのミリ秒タイムスタンプと74ビットのランダム値
- ブラウザーへの組み込み
- crypto.randomUUID()
- なし。数行のコードかライブラリを使う
- 向いている用途
- トークン、公開ID、タイミングを漏らしてはいけないもの
- データベースの主キー、ログ、イベントID
UUIDのバージョン選びは、ほとんどがデータベースの問題です。ランダムなv4のキーは挿入をインデックス全体に散らしますが、v7のキーは中央のカウンターなしに、自動採番の数値と同じように順番に届きます。下で両方を生成し、任意のUUIDを貼り付ければ、そのバージョンと、v7なら作成された時刻を確認できます。
- 生成ボタンを押すと、ブラウザー内で新しいv4またはv7のUUIDが作られます。
- コピーするか、任意のUUIDをデコーダーの入力欄に貼り付けます。
- デコーダーはバージョンの桁とバリアントのビットを読み取り、v7なら先頭48ビットを日時に変換します。
- v7の値を続けていくつか生成し、先頭の文字がほとんど変わらないことを確認してみましょう。
- データベースにネイティブのuuid列があれば、そこに保存しましょう。サイズでも比較でも、16バイトのほうが36文字の文字列より有利です。
- パスワードリセット用トークンなど、作成時刻が機密になる場面ではv7を使わないでください。IDを持つ人なら誰でも作成時刻を読み取れます。
- crypto.randomUUID()は安全なページ(HTTPSまたはlocalhost)でのみ動作します。通常のHTTPでは使えません。
- 同じミリ秒に作られた2つのv7 IDは、作成順ではなくランダムなビットで並びます。ただし、ライブラリがRFCで説明されているオプションのカウンター方式を使っている場合は別です。
よくある質問
GUIDとUUIDの違いは何ですか?
実用上の違いはありません。RFC 9562はUUIDを定義し、GUID(Globally Unique Identifier、Microsoftのツールで使われる名前)とも呼ばれると記しています。.NETやSQL Serverが生成するGUIDは、同じ36文字形式のUUIDです。
UUID v7は公式の標準ですか?
はい。2024年に公開されたRFC 9562は、従来のバージョンに加えてバージョン6、7、8を定義し、以前UUIDを規定していたRFC 4122を廃止しました。
UUID v7の一意性は十分ですか?
1ミリ秒ごとに74ビットのランダム値があり、ほぼどんなシステムにも十分です。衝突するには、まったく同じミリ秒に膨大な数のIDを作る必要があります。
v7のUUIDから作成時刻を取り出せますか?
はい。先頭の12桁の16進数がミリ秒単位のUnix時刻です。上のデコーダーに貼り付ければ日付として表示されますし、その桁を自分で16進数として解析することもできます。
既存のv4のキーをv7に切り替えるべきですか?
通常は不要です。どちらも有効なUUIDで同じ列に共存できるため、新しい行はv7を使い、古い行はv4のままにできます。主キーを書き換えると、それを参照するすべての外部キーも書き換えることになります。
データベースで順序が重要な理由
- 多くのデータベースは主キーをBツリーで管理しています。新しいキーが常に前のキーより大きければ、挿入はツリーの末尾に入り、最近書き込んだページはメモリに残ります。ランダムなキーはツリー全体のページへの書き込みを強いるため、テーブルが大きくなるほどページ分割とディスク読み込みが増えます。
- RFC 9562は、時系列順のバージョンを追加した理由の1つとしてこの局所性の問題を挙げており、新しいシステムに勧めているのがv7です。
構造の読み方
- テキスト形式では、13桁目の16進数(3番目のグループの先頭)がバージョンです。そのためv7のUUIDには必ずそこに7が、v4には4が入ります。4番目のグループの先頭の桁は、標準のバリアントなら8、9、a、bのいずれかです。
- v7では、バージョンの前にある12桁がタイムスタンプです。バージョンの桁より後ろは、2つのバリアントビットを除いてすべてランダムです。
UUIDの全8バージョン
RFC 9562におけるUUIDのバージョン
- グレゴリオ暦の時刻とノードID(多くはMACアドレス)
- レガシー。v7を推奨
- DCEセキュリティ版。RFC 9562では規定されていない
- まれ
- 名前ベース。名前空間と名前のMD5ハッシュ
- 同じ入力なら同じUUID
- ランダムまたは疑似ランダムのビット
- 一般的なデフォルト
- 名前ベース。名前空間と名前のSHA-1ハッシュ
- v3より推奨
- v1のタイムスタンプを時刻順にソートできるよう並べ替えたもの
- 新しいシステムにはv7を推奨
- ミリ秒単位のUnixエポック時刻とランダムなビット
- ソート可能なキー
- 実装側が選ぶ独自の構造
- 実験的またはベンダー独自の形式
コピーして使えるコード
ブラウザーやNodeでのUUID v4
現行ブラウザーの安全なページと、Node 19以降のグローバルなcryptoオブジェクトに組み込まれています。36文字の文字列を返します。
ライブラリなしのUUID v7
先頭6バイトに現在時刻を書き込み、バージョンとバリアントのビットを設定します。残りはランダムのままです。
v7のUUIDから時刻を読み取る
先頭12桁の16進数は1970年からのミリ秒数なので、解析すればDateが得られます。
生成と解読
v4を生成
v7を生成
生成結果
ボタンを押すとUUIDを作成します。ブラウザー内で作られ、どこにも送信されません。
解読するUUIDを貼り付け
バージョン:{v}
RFC 9562(標準のもの)
RFC 9562のバリアントではありません
作成日時:{v}(UTC)
このバージョンにはUnixタイムスタンプが含まれていません。
UUIDではありません。8-4-4-4-12のグループに分かれた32桁の16進数が必要です。
これはNil UUIDです:128ビットすべてが0です。
これはMax UUIDです:128ビットすべてが1です。
無料で始める · クレジットカード不要
関連: ガイド|Webマーケティングと集客を学ぶ
製品
ご利用いただける方
機能
リソース
会社情報
サイトマップを見る