UUID 生成

ブラウザでUUIDを生成:完全ランダムなv4、データベースキー向けの時系列順v7、または名前空間と名前からの決定的v5。一度に最大1000個作成でき、デバイスからデータが外部に出ることはありません。

「生成」を押して抽選
バージョン
詳細オプション

他の誰かが作成したものと衝突せず、聞いたこともないマシン上でも、誰の許可を得ることもなく識別子を作成したいですか? それこそがUUIDの役割です。これは128ビットの数値で、おなじみの 8-4-4-4-12 のパターンに従って36文字で記述されます。誰がどの値を取得するかを調整する仕組みがなくても、2つのUUIDが同じになることがないように設計されています。この無料ジェネレーターはブラウザ上でUUIDを生成します。「バージョン」でバージョンを選択し、個数 で必要な数を指定して、生成 を押すだけです。ページを開いた初期状態では、ほとんどのプロジェクトで求められる単一の v4 が表示されるため、最初の識別子はワンクリックで手に入ります。

各識別子は Web Crypto API を通じてブラウザによって生成されます。バージョン 4 は、ブラウザが提供している場合は crypto.randomUUID() を、そうでない場合は crypto.getRandomValues() を使用します。つまり、Math.random() のような JavaScript の疑似乱数関数ではなく、暗号論的に強力な乱数ソースを使用しています。バージョン 7 は先頭に 48 ビットのミリ秒単位のタイムスタンプを配置し、次に同一ミリ秒内で増加する 12 ビットのカウンター、そして 62 ビットの乱数を続けます。これは RFC 9562 で説明されているソート可能な手法であり、このカウンターの存在により、1000個のバッチがシャッフルされず順番に出力されるようになっています。バージョン 1 は、タイムスタンプとマルチキャストビットが設定されたランダムなノード識別子を組み合わせたものです。そのため、1990年代の初期の実装のようにネットワークカードのアドレス(MACアドレス)が含まれることはありません。バージョン 3 と 5 は全くランダムではなく、MD5 と SHA-1 をそれぞれ使用して名前空間と名前のハッシュを計算します。このハッシュ処理もデバイス上で行われます。サーバーには何も送信されず、ログも記録されません。一度ページが読み込まれれば、オフラインになっても機能し続けます。

「バージョン」は他のすべての要素を決定するフィールドです。バージョン 4 は 122 ビットの乱数であり、構造を持たないため、デフォルトの選択肢として、単に一意性が求められる場合の正解となります。バージョン 7 は 62 ビットの乱数を維持しつつ先頭に作成時間を配置するため、生成された順にソートすることができます。これは識別子がデータベースのキーになる場合に選ぶべきバージョンです。バージョン 1 はオリジナルの時間ベースのスキームであり、未だにそれを要求するシステムのために残されています。バージョン 3 と 5 は特殊なペアです。これらは決定的(deterministic)であり、同じ入力からは常に同じ識別子が生成されます。これらには2つの追加フィールドが必要です。「名前空間」は、標準空間である DNS、URL、OID、X.500 のいずれか、または独自の「カスタム」を選択し、「名前」には識別される文字列を入力します。v5 に URL 名前空間と https://example.com/a を与えれば、今日でも明日でも、他人のマシン上でも同じ UUID が得られます。このため、v3 または v5 が選択されると 個数 フィールドは非表示になります。決定的な値の1000個のコピーは、単に決定的な値が1000個並ぶだけだからです。それ以外のすべてのバージョンでは、個数 は 1 から 1000 まで指定できます。

4つのスイッチは、基盤となる128ビットを変更することなく、出力の形式のみを変更します。「大文字」は16進数を A–F の大文字で出力し、「ハイフンなし」は一部の列やファイル名で好まれるコンパクトな32文字の形式を提供します。「中括弧」は値を { } で囲み、Windows や .NET の世界で GUID と呼ばれる形式にします。詳細オプション にある urn:uuid: は、これを正式な URN にするためのプレフィックスを追加します。これがオンの間は、「中括弧」と「ハイフンなし」がオフになります。なぜなら、標準規格で許容される URN の形式は厳密に1つだけであり、ハイフン付きの正規(canonical)形式だからです。「コピー形式」は、バッチを取得する際の結合方法を決定します。1行に1つ、カンマ区切り、または各値を引用符で囲んでカンマを付けた形式(コード内の配列に直接貼り付け可能)を選べます。結果の下には、乱数のビット数(v4 は 122、v7 は 62)と、v7 の場合はバッチの最初の識別子にエンコードされたタイムスタンプを報告する行があり、値の内部の時間が暗黙のものではなく可視化されます。すべてコピー と ファイルに保存 の両方が 「コピー形式」を尊重します。履歴 は自分のブラウザ内に最新の10個のバッチを保存します。クリックして復元するか、個別のエントリをコピーまたは削除するか、あるいはすべてをクリアできます。クリア は結果を空にしますが設定はそのまま維持します。識別子が50個を超えると、リストは50行並ぶのではなく、1つのスクロール可能なブロックになります。

このページで最も重要なのは、プライマリキーとしての v4 と v7 の違いであり、これは好みの問題ではありません。データベースのインデックスはソートされた順序を保つツリー構造(B-treeなど)であり、新しいキーがその順序のどこに配置されるかが、挿入にかかるコストを決定します。v4 のキーはランダムであるため、連続した挿入はインデックス内の無関係な箇所に配置されます。その結果、いっぱいになったページが分割され、データベースがメモリに保持しているツリーの部分と、次の挿入で必要となる部分がめったに一致しなくなり、インデックスは指し示す行に見合う以上に大きく断片化した状態になります。一方、v7 のキーは現在のミリ秒から始まるため、連続した挿入はツリーの右端に隣接して配置されます。これは自動インクリメントされる整数が生成するパターンであり、インデックス構造が元々想定して構築されたパターンです。これがすべてのトレードオフです。v7 はシーケンシャルなキーの挿入パフォーマンスをもたらしつつ、そもそも UUID を選んだ理由である「誰でもサーバーに尋ねることなく生成できる」という特性を維持します。その代償として、作成時間が識別子の内部から読み取れるようになります。これが問題になるかどうかはフォーマットの問題ではなく、あなたのデータに関する問題です。

UUID の一意性をチェックするものは何もありません。そのサイズ自体が保証となっています。レジストリも、サーバーへのラウンドトリップも、ルックアップ(照会)も存在しません。ジェネレーターは単に数値を生成して引き渡すだけであり、2つの UUID が衝突しない理由は単純に、2^122(約 5.3×10^36)個の v4 の値が存在するからです。誕生日のパラドックスを用いてこれを正直に評価すると、2つの値が一致する確率が50%になるまでに、約 2.7×10^18 個の識別子が必要になります。これは、毎秒10億個の新しい UUID を86年間生成し続ける計算です。これが何を約束し、何を約束しないのかを正確に理解する価値があります。これは絶対的な保証ではなく統計的な保証であり、基盤となる乱数が本物である場合にのみ成り立ちます。シードの初期化が不適切なジェネレーターや、エントロピープールごとクローンされた仮想マシンは、フォーマット自体では検出できない形でこの保証を破壊します。バージョン 7 はこの問題をさらに絞り込みます。単一のミリ秒内では、カウンターはサイコロを振るのではなくインクリメントされるため、ジェネレーターは全く同じ値を繰り返すことができません。そして独立したジェネレーター間では、62 ビットの乱数がその役割を果たします。

UUID は識別子であり、パスワードではありません。バージョン 4 は予測不可能であるため、パスワードリセットリンク、推測不可能な URL、セッショントークン、API キーなど、秘密として扱いたくなる誘惑に駆られます。予測不可能であることは事実ですが、秘密性とは値がどのように扱われるかの性質であり、識別子は設計上、無頓着に扱われます。これらは URL に含まれ、ブラウザの履歴、サーバーのログ、リファラーヘッダー、分析ツールに残り、チャットメッセージに貼り付けられます。他のバージョンはさらに不適切な候補です。バージョン 1 とバージョン 7 はどちらも作成された瞬間をエンコードしているため、それを保持している人は誰でもそれが作成されたおおよその時期を知ることができ、同時に作成されたすべてのものの周辺を絞り込むことができます。バージョン 3 と 5 は意図的に決定的です。メールアドレスの v5 UUID はハッシュ化された秘密ではなく、同じアドレスを持つ人なら誰でも1秒で計算できる値です。物事に名前を付けるには UUID を使用してください。値が未知のままである必要がある場合は、パスワードジェネレーター、または秘密を扱うために構築されたライブラリからのトークンを使用してください。

なぜこの UUID ジェネレーターを選ぶのか?

UUID は、名前が空いていることを確認する前に何かに名前を付ける必要がある場所ならどこにでも登場します。アプリケーションコードは、挿入しようとしている行のためにUUIDを生成します。これにより、オブジェクトはデータベースに到達する前からアイデンティティを持ち、書き込みの実行中であってもクライアントがそれを参照できるようになります。分散システムはこれにさらに依存しています。複数のサービスが1つのテーブルに書き込む場合、オフラインのモバイルクライアントが飛行機内でレコードを作成する場合、すでに処理したメッセージを認識しなければならないキューなど、これらはいずれも共有カウンターの順番を待つことができません。バージョン 5 は、すでに持っているものから導き出される安定した識別子という異なるニーズをカバーします。同じドキュメント、同じ URL、または同じアカウントは常に同じ UUID にマッピングされるため、重複させることなくインポートを2回実行できます。他の場所では、単にシステムが要求するフォーマットとして機能します。ログやトレースを通して関連付けられる相関識別子、1000人のユーザーからのアップロードが1つのバケットに届いたときに衝突しないファイル名、Windows レジストリキー、実際のデータのように見せかける必要があるテスト用のフィクスチャデータなどです。

知っておくべきいくつかの妥当な制限があります。1つのバッチは1つのバージョンです。「バージョン」の値はそのバッチのすべての要素に適用されるため、v4 の実行と v7 の実行は2つの別々のバッチとなります。これはジェネレーターであり、インスペクター(検査ツール)ではありません。UUID を貼り付けてそのバージョンやタイムスタンプを読み取ることは、このページではできません。ファイルに保存 は、CSV や JSON ではなくプレーンテキストファイルを書き出します。バージョン 7 はそれが作成された日時をミリ秒単位で公然と明らかにしますが、これは欠陥ではなく真のトレードオフです。また、バージョン 1 も同様に時間を漏らします。これがデータにとって問題になる場合、誰にも何も伝えないバージョン 4 を使用してください。標準規格にある2つの特別な値はバージョンではないため、「バージョン」のオプションにはありませんが、ここからコピーできます。nil UUID の 00000000-0000-0000-0000-000000000000 と、max UUID の ffffffff-ffff-ffff-ffff-ffffffffffff です。このページのすべては、2024年に RFC 4122 に代わる仕様となった RFC 9562 に準拠しているため、出力されたものは UUID を処理するあらゆるライブラリ、データベース、または API で受け入れられます。これらの制限の中で、保証は強力です。すべての識別子は標準に従って、暗号論的に安全な乱数から、あなた自身のマシン上で構築され、他の誰の目にも触れることはありません。

FAQ

UUID を生成するにはどうすればよいですか?

「バージョン」でバージョンを選択し、個数 で必要な数を設定して、生成 を押します。ページを開いた初期状態では、ほとんどのプロジェクトで求められる単一のバージョン 4 識別子が表示されるため、通常の UUID はワンクリックで手に入ります。各値には個別のコピーボタンが表示され、すべてコピー はバッチ全体を一度に取得します。

UUID v4 と v7 の違いは何ですか?

バージョン 4 は全く構造を持たない 122 ビットの乱数であり、2つの間に何の関係もありません。バージョン 7 は最初の 48 ビットを作成されたミリ秒に費やし、カウンターと 62 ビットの乱数を追加するため、ソート可能です。バッチは生成された順序で出力されます。識別子が一意であることのみが求められる場合は v4 を使用し、データベースのキーにもなる場合は v7 を使用してください。

どの UUID バージョンを使用するべきですか?

他のバージョンを選択する理由がない限り、バージョン 4 を使用してください。識別子がプライマリキーとなり、挿入のパフォーマンスが重要になる場合はバージョン 7 を、同じ入力から常に同じ識別子を生成する必要がある場合はバージョン 5 を、そして特定のシステムが通信にそれを要求する場合にのみバージョン 1 を選択してください。バージョン 3 は SHA-1 の代わりに MD5 を使用したバージョン 5 であり、互換性のために存在します。

生成された UUID は本当にランダムで安全ですか?

乱数は暗号論的に安全です。Math.random() ではなく、ブラウザの Web Crypto API を通じて crypto.randomUUID() または crypto.getRandomValues() から提供されます。推測不可能という意味での安全性は、秘密という意味での安全性とは別の問題です。UUID は識別子であり、パスワード、セッショントークン、または API キーとして使用するべきではありません。

一度に多くの UUID を生成できますか?

はい、一度に最大1000個まで生成できます。個数 を設定して 生成 を押します。50個を超えると、結果は長い行のリストではなく、1つのスクロール可能なブロックになります。すべてコピー と ファイルに保存 は、「コピー形式」が指定する方法(1行に1つ、カンマ区切り、または配列に貼り付けるための引用符付き)で結合されたバッチ全体を取得します。

v3 と v5 が毎回同じ UUID を生成するのはなぜですか?

それがこのバージョンの目的だからです。バージョン 3 と 5 は決定的です。与えられた名前空間と名前のハッシュを計算するため、同一の入力からは、どのマシンでも、どのプログラミング言語でも常に同一の識別子が生成されます。これにより、すでに持っている情報から安定した識別子を導き出すのに役立ちます。また、これらのバージョンを選択したときに 個数 が非表示になるのもそのためです。

「名前空間」と「名前」とは何ですか?どの名前空間を選ぶべきですか?

これらは、バージョン 3 またはバージョン 5 の UUID を計算するための2つの入力です。「名前空間」は名前がどのような種類のものかを示します。ホスト名の場合は DNS、アドレスの場合は URL、ディレクトリスキームの場合は OID と X.500 を指定し、アプリケーション内で独自の UUID を名前空間として提供したい場合(これが一般的な選択です)は「カスタム」を指定します。「名前」は文字列そのものです。同じ名前でも名前空間が異なれば全く異なる結果が得られます。これが名前空間を持つ目的です。

なぜデータベースのプライマリキーには v4 よりも UUID v7 の方が優れているのですか?

値がインデックス内のどこに配置されるかによるためです。インデックスはソートされた順序を保ちますが、ランダムな v4 のキーはインデックス内のどこにでも配置されるため、挿入によってツリー全体のページが分割され、メモリに保持された部分が次に必要な部分になることはめったにありません。v7 のキーは現在のミリ秒から始まるため、連続した挿入はインデックスの最後にまとまって配置されます。これはシーケンシャルな整数キーの動作と同じでありながら、中央のカウンターに問い合わせることなくどのサービスでも識別子を生成できるという利点があります。

2つの UUID が同じになることはあり得ますか?

原理的には「はい」ですが、現実的には「いいえ」です。これを知っておく価値があります。一意性を検証するものは何もありません。単にバージョン 4 の可能な値が 2^122(約 5.3×10^36)個あるというだけであり、1回の衝突が起こる確率が50%になるまでに、およそ 2.7×10^18 個の識別子(毎秒10億個を86年間)が必要になります。これは絶対的ではなく統計的な保証であり、基盤となる乱数が本物であることに依存しています。だからこそ、このジェネレーターは一般的な疑似乱数関数ではなく Web Crypto API を使用しているのです。

UUID をパスワード、API キー、またはセッショントークンとして使用できますか?

いいえ。そしてこれが最も代償の大きい間違いです。バージョン 4 の UUID は予測不可能ですが、識別子は公開されているものとして扱われます。これらは URL、ブラウザの履歴、サーバーのログ、リファラーヘッダー、分析データに含まれることになります。バージョン 1 と 7 はさらに作成日時も明らかにします。また、バージョン 3 と 5 は入力を知っている人なら誰でも再計算できます。秘密にしておくべきものには、パスワードジェネレーターや、秘密用に作られたライブラリからのトークンを使用してください。

UUID v7 はいつ作成されたかを明らかにしますか?

はい、ミリ秒単位で明らかにします。これは見落としではなく意図的な設計であり、タイムスタンプこそが v7 をソート可能にしている理由です。結果の下の行にはバッチの最初の値にエンコードされた時刻が表示されるため、何が公開されているかを正確に確認できます。バージョン 1 にもタイムスタンプが含まれています。作成日時を公開したくない場合は、誰にも何も伝えないバージョン 4 を使用してください。

UUID v1 は私の MAC アドレスを公開しますか?

ここでは公開しません。オリジナルのスキームはマシンのネットワークカードのアドレスをノードフィールドとして使用しており、これが v1 の評判の元となっていますが、標準規格ではマルチキャストビットが設定されたランダムなノード識別子も許可されており、このジェネレーターが生成するのはそれです。あなたのハードウェアアドレスが読み取られたり、出力に現れたりすることは決してありません。

「大文字」、「ハイフンなし」、「中括弧」、urn:uuid: は何を変更しますか?

表示のみを変更します。基盤となる 128 ビットはどの形式でも同一です。「大文字」は16進数を A–F の大文字で出力し、「ハイフンなし」はコンパクトな 32 文字のバージョンを提供します。「中括弧」は Windows や .NET が GUID を記述するのと同じように値を { } で囲み、urn:uuid: は正式な URN にするためのプレフィックスを追加します。urn:uuid: をオンにすると他の2つのオプションはオフになります。標準規格で定義されている URN 形式は厳密に1つだけであり、それがハイフン付きの正規形式だからです。