使い方
ページを開くと、バージョン4のUUIDがすでに10個できています。UUIDを生成で変えられるのは次の項目です。
- バージョン:「v4(完全ランダム)」か「v7(時系列順)」を選びます。選んだ瞬間に作り直されます。
- 生成する個数:1〜1000の整数で指定します。範囲外の値を入れた場合は、欄の外に出たときに1か1000へ直されます。
- 大文字、ハイフンなし、中括弧 { }:結果をどう書くかを決めます。
- 生成する:設定はそのままで、値だけ新しくします。
- すべてコピー、.txtでダウンロード:結果を1行に1つずつ、まとめて取り出します。ダウンロードされるファイル名はuuid.txtです。各行のコピーボタンを使えば、1つだけ取り出せます。
100個を超えて作ると、画面に並ぶのは最初の100個だけで、残りは「すべて表示」を押すと出てきます。すべてコピーとダウンロードの対象には、隠れている分も含まれます。
その下のUUID解析にUUIDを1つ貼り付けると、「バージョン」「バリアント」「埋め込まれたタイムスタンプ」がわかります。
バージョン4とバージョン7の違い
UUIDは128ビットの値です。このうち6ビットはバージョンとバリアントを書く場所と決まっていて、残る122ビットの埋め方がバージョンごとに違います。
| 位置 | バージョン4 | バージョン7 |
|---|---|---|
| 先頭の48ビット | ランダム | 1970年1月1日(UTC)から数えたミリ秒 |
| 4ビット | バージョン(4) | バージョン(7) |
| 12ビット | ランダム | RFC 9562ではランダムの場所ですが、このツールはカウンターに使います |
| 2ビット | バリアント | バリアント |
| 62ビット | ランダム | ランダム |
バージョン4は、値を眺めても何の手がかりも得られません。一方で並び順というものがないため、データベースの主キーにすると、新しい値がインデックスの至るところに割り込みます。その分だけB-treeのページ分割が増え、キャッシュのヒット率も落ちます。
バージョン7は先頭が時刻なので、文字列として並べ替えるだけで作った順に並びます。主キーにすれば、新しい値はインデックスの末尾に足されていきます。その代わり、いつ作られたかがミリ秒の単位まで値から読めてしまいます。会員登録や注文の時刻を外から推測されたくない識別子には、バージョン4のほうが向いています。
バージョン4はブラウザの crypto.randomUUID() で作り、バージョン7のランダム部分は crypto.getRandomValues() で埋めています。どちらも暗号論的に安全な乱数です。
まとめて作ったバージョン7が順番どおりに並ぶ理由
バージョン7を複数個作るとき、その1回分にはすべて同じミリ秒を使います。タイムスタンプで差がつかないので、順番を決めるのはその後ろにある12ビットのカウンターです。
- 1回分の最初の値では、カウンターを0〜2047のランダムな数から始めます。12ビットなら4095まで書けるところを半分しか使わないのは、あふれないように余裕を残すためです。
- 2つ目からは、カウンターを1ずつ増やします。一度に作れるのは最大1000個なので、開始値がいちばん大きい2047だったとしても3046で終わり、カウンターがあふれることはありません。
- 後ろの62ビットは、値を作るたびに引き直します。
たとえばタイムスタンプが2026年1月1日 00:00:00.000(UTC)、カウンターの開始値が2047なら、続けて出る3つの値の先頭部分は 019b76da-a800-77ff、019b76da-a800-7800、019b76da-a800-7801 となります。ハイフンで区切った3番目のグループは、先頭の7がバージョン、続く3桁がカウンターです。
カウンターは、次の回には持ち越しません。「生成する」をもう一度押すと、その瞬間の時刻で仕切り直すので、あとの回に作った値はタイムスタンプの段階で前の回より後ろに来ます。ただし、そのあいだに端末の時計が巻き戻されていると、この順番は保たれません。
衝突の可能性
バージョン4は122ビットがランダムです。誕生日のパラドックスの考え方で計算すると、同じ値が一度でも出る確率が50%に届くのは、約2.7 × 10^18個を作ったときです。1秒に10億個のペースで作り続けても、約86年かかります。
このツールのバージョン7では、値ごとに引き直すランダム部分は62ビットです。同じ回に作った値はカウンターがそれぞれ違うので、重なることはありません。別の端末や別のタブで同じミリ秒に作られた値と重なるのは、カウンターと62ビットのランダム部分がどちらも一致したときだけです。
解析でわかること
解析欄に 018f4d2e-7c3a-7b21-9e2f-1a2b3c4d5e6f を入れると、バージョン7、バリアントは「RFC 9562(標準)」、埋め込まれたタイムスタンプは2024年5月6日 09:14:03(UTC)と読み取ります。時刻はブラウザのタイムゾーンで表示されるので、UTC+9のタイムゾーンなら18:14:03です。
- バージョンは、3番目のグループの先頭の桁(16進数の13桁目)を数字のまま表示します。標準にない値であっても、そのまま出します。
- バリアントは、4番目のグループの先頭の桁のビットで決まります。
| 画面の表示 | 4番目のグループの先頭の桁 | 意味 |
|---|---|---|
| NCS(旧形式互換) | 0〜7 | 昔のNCS方式との互換のために残されている値 |
| RFC 9562(標準) | 8、9、a、b | 現在使われている標準のUUID |
| Microsoft(旧GUID形式) | c、d | 昔のMicrosoft GUIDとの互換用 |
| 将来の使用のために予約 | e、f | まだ定義されていない値 |
- すべての桁が0なら「Nil UUID」、すべての桁がfなら「Max UUID」の表示が付きます。RFC 9562によると、Nilは「値なし」を、Maxは一覧の終わりなどを示す目印として使えます。桁の値をそのまま読むので、Nilはバージョン0でNCSのバリアント、Maxはバージョン15で予約済みのバリアントと表示されます。
解析が見ているのは形だけです。16進数32桁でありさえすれば通るので、通ったからといって、実際に発行されたUUIDだとは限りません。手で書き換えた値でも、バージョンの桁が7であれば、その桁の数字どおりにタイムスタンプを読んで表示します。
