どのバージョンを選ぶ?
v4は122ビットがランダムなので、URLに入れるトークンのように、何も推測されてはいけないIDの無難な選択です。v7はミリ秒単位のタイムスタンプで始まるので、IDが作成順に並びます。データベースのインデックスがコンパクトに保たれ、挿入も速いまま。主キーに向いているのはそのためです。どちらもRFC 9562に準拠した標準のUUIDです。
ランダムなUUID v4や時刻順のUUID v7を、1つずつ、または一度に最大100個まで、ハイフンあり・なしで生成できます。
UUID v4は、暗号論的に安全な乱数を使います。汎用の一意な識別子に最適です。
識別子を貼り付けると、有効かどうか、バージョン、v7 の場合は含まれる日時がわかります。
v4は122ビットがランダムなので、URLに入れるトークンのように、何も推測されてはいけないIDの無難な選択です。v7はミリ秒単位のタイムスタンプで始まるので、IDが作成順に並びます。データベースのインデックスがコンパクトに保たれ、挿入も速いまま。主キーに向いているのはそのためです。どちらもRFC 9562に準拠した標準のUUIDです。
ランダムなビットは、Math.randomではなく、ブラウザの暗号論的な乱数生成器(Web Crypto)から取ります。同じミリ秒の中で作ったv7のIDも値が増えていくので、まとめて作っても順番が保たれます。1つずつでも、一度に最大100個でも、大文字・小文字、ハイフンあり・なしでコピーできます。
UUIDは、ハイフンで区切った5つのグループの32文字の16進数で表されます(8-4-4-4-12)。例:550e8400-e29b-41d4-a716-446655440000。3つ目のグループの最初の文字がバージョン(v4なら4、v7なら7)、4つ目のグループの最初の文字がバリアント(RFC 9562の標準バリアントなら8、9、a、b)を表します。
全体で128ビット(16バイト)です。v4では、そのうち122ビットがランダムです。v7では、最初の48ビットがミリ秒単位のUnixタイムスタンプ、4ビットがバージョン、2ビットがバリアントで、残りの74ビットがランダムです。ここでは同じミリ秒の中では値を増やしていくので、v7のUUIDのリストは常に作成順に並びます。
UUIDを主キーに使うと、いくつもの利点があります。複数のデータを統合しても重複せず、IDを一元的に発行する仕組みも不要で、注文数やユーザー数などのビジネス上の数字が連番から推測されることもなく、データベースに挿入する前にクライアント側でIDを作れます。
主な欠点は、サイズ(32ビットの整数の4バイトに対して16バイト)と、v4ではランダムに散らばるために、B-treeのインデックスが断片化して挿入が遅くなることです。UUID v7は時刻順なので挿入が順番どおりになり、インデックスにやさしく、断片化の問題を解決します。
UUID v4(ランダム:汎用に最適)か、UUID v7(時刻順:データベースのキーに最適)を選びます。
生成するUUIDの数(1〜100)と、形式(ハイフンあり・なし、大文字・小文字)を選びます。
「生成」を押してから、「すべてコピー」ですべてのUUIDを一度にクリップボードにコピーします。
UUID v1は、タイムスタンプと端末のMACアドレスを組み合わせたものです。一意性は保証されますが、作成者のネットワーク上の識別情報と作成日時がわかってしまうため、プライバシーの懸念があります。最近のアプリケーションではほとんど使われていません。
UUID v4は、いちばん広く使われているバージョンです。122ビット(バージョンとバリアントの6ビットを除く)はすべて、暗号論的に安全な乱数生成器で作られます。シンプルでプライバシーも守られ、重複の確率も天文学的に低いのが特長です。
ランダムなv4、時刻順のv7AwesomeToolkitは、UUIDをすべてブラウザ内で生成します。v4では、使える場合はcrypto.randomUUID()を、使えない場合はcrypto.getRandomValues()を使います。v7では、Date.now()とcrypto.getRandomValues()を組み合わせています。
識別子は端末の中で生成され、記録されたり使い回されたりすることはありません。一度読み込めば、オフラインでも使えます。
ブラウザ内で生成UUID・GUID生成ツールについて知っておきたいこと