UUID v7 とは
UUID v7 は 48 ビットの Unix 時刻 (ミリ秒) を先頭に、続いてバージョンとバリアントのビット、そして一意性を保つための 74 ビットを配置します。タイムスタンプが先頭にあるため、2 つの UUID を辞書順に比べることは生成時刻を比べることに等しくなります。
これは B-tree インデックスで重要です。v4 のような乱数キーは挿入を木全体に散らし、ページ分割とキャッシュの圧迫を招きます。v7 は順に書き込まれるため、インデックスが小さく保たれ書き込みも速くなります。
使い方
- 生成する件数を選びます。
- システムが求める場合は大文字や波括弧を有効にします。
- 生成を押します。一覧は生成時刻の昇順になります。
用途
- インデックス付きのデータベース主キー。
- 期間で検索する必要があるイベント識別子。
- キューやイベントストリームの並べ替えキー。
- 時刻で分割するレコード。
UUID v7 の位置づけ
| 選択肢 | 使う場面 |
|---|---|
v7 | Unix ミリ秒。シンプルで並べ替え可能 |
v6 | 100 ナノ秒の分解能とノード欄を持つ v1 互換向け |
v4 | インデックス全体に散らばるため書き込みが多い主キーには不向き |
UUID の各バージョン早見表
| バージョン | 並べ替え可能 | 基になる情報 | 向いている用途 |
|---|---|---|---|
| v1 | 不可 | タイムスタンプ + MAC アドレス | v1 に依存したままの既存システム |
| v3 | 不可 | 名前の MD5 ハッシュ | MD5 を使わざるを得ない場面の決定的な識別子 |
| v4 | 不可 | 122 ビットの乱数 | 一般的な識別子のほとんど |
| v5 | 不可 | 名前の SHA-1 ハッシュ | 同じ名前から常に同じ識別子を得たいとき |
| v6 | 可 | 並べ替えたタイムスタンプ | 乱数性を保ったまま並べ替えたいとき |
| v7 | 可 | ミリ秒精度の Unix 時刻 | データベースの主キーやイベント識別子 |
| v8 | 不可 | 独自のビット配置 | 独自形式や実験的な用途 |
7 つのバージョンはいずれも 128 ビットで、同じ 8-4-4-4-12 の形式で表記します。違うのはビットの意味だけです。
よくある質問
UUID v7 は生成時刻を漏らしませんか?
漏らします。先頭 48 ビットがそのまま生成時刻 (ミリ秒) なので、値を持つ誰でも作成時刻を割り出せます。これが問題になる場合は v4 を使ってください。
v7 は重複しますか?
乱数部分が十分であれば重複しません。同じミリ秒に複数の値が生成されても、74 ビットの乱数がそれらを区別します。同一ミリ秒内で衝突する確率はごくわずかです。
v4 から v7 に移行すべきですか?
書き込みが多く、値がインデックス付きの主キーである場合は移行する価値があります。相関識別子として使うだけで並べ替えを必要としないなら、v4 のままで十分であり、生成時刻も漏れません。