UUID生成

UUIDをまとめて生成します。バージョン4(ランダム)とバージョン7(時刻順)に対応し、大文字・ハイフンなしなどの書式も選べます。 貼り付けたUUIDの版を調べることもできます。

UUIDを調べる

乱数はブラウザの暗号用乱数(crypto.getRandomValues)から取っています。 生成も判定も端末内で完結し、値は送信されません。

UUIDとは

UUID(Universally Unique Identifier)は、中央の管理なしに一意な識別子を作るための仕組みです。 128ビットの値を16進数で表し、8-4-4-4-12 の区切りで36文字になります。 採番サーバーに問い合わせる必要がないため、分散したシステムでもそれぞれが勝手にIDを作れます。

種類特徴
バージョン4(ランダム)122ビットが乱数。最も広く使われる
バージョン7(時刻順)先頭が時刻なので生成順に並ぶ。主キー向き
nil UUIDすべて0。「値なし」を表す特殊なUUID
max UUIDすべてF。最大値を表す特殊なUUID

v4とv7の中身の違い

どちらも128ビットですが、先頭に何を入れるかが違います。 v7は時刻を先頭に置くことで、文字列として並べ替えるだけで生成順になります。

時刻だけでは同じミリ秒に作った複数のUUIDの順序が保証されません。 当ツールは RFC 9562 が示す「固定長カウンタ」方式にならい、時刻に続く12ビットを 同一ミリ秒内の連番に使っています。1,000件をまとめて作っても順序が崩れないのはこのためです。

位置バージョン4バージョン7
1つ目(8桁)乱数Unixミリ秒の上位32ビット
2つ目(4桁)乱数Unixミリ秒の下位16ビット
3つ目(4桁)先頭が「4」=版、残りは乱数先頭が「7」=版、残りは同一ミリ秒内の連番
4つ目(4桁)先頭2ビットがバリアント、残りは乱数同左
5つ目(12桁)乱数乱数

3つ目のかたまりの先頭1文字が版の番号です。v4なら「4」、v7なら「7」が必ず入ります。 4つ目のかたまりの先頭はバリアントで、RFC 9562に従うものは 8・9・a・b のいずれかになります。 生成したUUIDを見ると、この2か所が固定されているのが確認できます。

主キーに使うときの注意

UUIDをデータベースの主キーにすると、連番と違って値が飛び飛びになるのが問題になります。 B木の索引は値の順に並んでいるため、ランダムな値を挿入するたびに index のあちこちが書き換わり、 件数が増えるほど遅くなります。

  • v7を使う — 時刻が先頭なので末尾に追記され、この問題が起きにくくなります。
  • 16バイトで保存する — 36文字の文字列より、バイナリ16バイトのほうが索引が小さく済みます。
  • 推測されない値であることに頼らない — v4は乱数ですが、URLに出す識別子の安全性を乱数性だけに頼るのは危険です。認可の確認は別途行ってください。

よくある質問

UUIDは重複しないのですか?

バージョン4のUUIDは122ビットが乱数なので、組み合わせは約5.3×10の36乗通りあります。毎秒10億個を100年間作り続けても衝突する確率はごくわずかで、実用上は重複しないものとして扱えます。ただし乱数の質が悪いと話は別で、当ツールはブラウザの暗号用乱数を使っています。

バージョン4とバージョン7はどちらを使えばいいですか?

用途を選ばないならv4、データベースの主キーに使うならv7が向いています。v7は先頭48ビットがUnixミリ秒で、続く12ビットを同一ミリ秒内の連番にしているため、生成した順に並びます。ランダムな値を主キーにすると挿入のたびに索引の飛び飛びの位置が書き換わり性能が落ちますが、v7なら末尾に追記されるだけなので、その問題が起きにくくなります。

バージョン7から生成時刻が分かってしまいますか?

分かります。先頭48ビットがそのままミリ秒なので、UUIDを見れば「いつ作られたか」が読み取れます。当ツールの「UUIDを調べる」欄に貼り付けると実際に時刻が表示されます。時刻を知られたくない用途では、v4を選んでください。

ハイフンは付けたほうがいいですか?

標準の表記はハイフンありの36文字(8-4-4-4-12)です。データベースに16バイトのバイナリで保存する場合など、ハイフンを外した32文字を使う場面もあります。どちらでも表す値は同じなので、システム内で表記をそろえることのほうが大切です。

nil UUIDとmax UUIDは何に使いますか?

nil UUID(すべて0)は「値がない」ことを表す特別な値で、未設定や無効を示すのに使われます。max UUID(すべてF)はRFC 9562で追加されたもので、範囲検索の上限を表すときなどに使います。どちらも乱数ではないので、識別子としては使いません。

生成した値は送信されますか?

いいえ。生成も判定もすべてブラウザ内で行われ、値が外部へ送信・保存されることはありません。

関連ツール

推測されにくい文字列が必要なら パスワード生成、 通し番号を作るなら 連番生成 が使えます。 値の同一性を確かめるには ハッシュ値の計算、 16進数の確認は 基数変換 をどうぞ。 APIのやりとりで使う JSON整形Base64 変換、時刻の確認にはUnixタイムスタンプ変換 も便利です。