分散システムのための効率的なCUID生成器
衝突耐性を持つCUID2形式の一意識別子を、ブラウザ内の処理だけで即座に生成する無料ツール。データベースの主キーや分散システムのレコードID、Webアプリケーションのオブジェクト識別子として使え、時系列でソート可能かつURLにも安全に使える文字列を作成できる。
CUIDジェネレーター
衝突の可能性が低いIDをすばやく簡単に生成します。
ドキュメンテーション
CUIDとは?
CUID(衝突耐性のある一意識別子)は、レコード、ファイル、イベントに名前を付け、どの2つの項目にも同じ名前を付けないようにするための、英字と数字からなる短い文字列です。このツールは、@paralleldrive/cuid2ライブラリを使用して、現在の形式であるCUID2を生成します。各IDは25文字で、小文字の英字と数字だけで構成され、すべてブラウザー内で生成されます。サーバーには何も送信されません。
このCUID生成ツールの使い方
- Generate New CUIDをクリックしてIDを生成します。
- Copy to Clipboardをクリックしてコピーします。
- IDをデータベース、ファイル名、またはアプリケーションに貼り付けます。
- もう一度Generateをクリックすると、別のIDが生成されます。異なるCUID2値の間で衝突する可能性は極めて低いものの、数学的に不可能ではありません。
- Resetをクリックして結果を消去します。
生成されたIDはページのURLにも保存されるため、結果へのリンクを共有したり、ブックマークしたりできます。
CUID2の構造と式
CUID2は次のように構成されます。
1id = randomLetter + base36( SHA3-512( time + entropy + counter + fingerprint ) ).substring(1, length)
2ハッシュ関数は、現在時刻、セッションごとのカウンター、ホストマシンのフィンガープリント、ランダムエントロピーという4つの非公開入力を混合します。それらをSHA3-512に通し、結果を36進数(数字0–9と英字a-z)に変換してから、その文字のうち24文字を残します。先頭にランダムな英字を加えることで、完成したIDは、このツールで設定されている長さである25文字になります。
最初の文字だけは独立しています。すべてのIDが数字ではなく英字で始まるよう、先頭にランダムな英字が置かれます。SQLのテーブル名やカラム名など、多くのシステムでは識別子を英字で始める必要があるため、これによりCUID2はほとんどどこでも名前として安全に使用できます。最初の英字以降の各文字は、1つの連続した不透明なハッシュ本体の一部であり、個別のセクションには分かれていません。
ハッシュは一方向にしか機能しないため、完成したIDから入力値を取り出すことはできません。CUID2には復元可能なタイムスタンプ、カウンター、フィンガープリントがありません。これは意図的なプライバシーおよびセキュリティ上の選択です。IDだけから、いつ、どこで作成されたかを知ることはできません。
計算例
このツールでIDを生成すると、次のようになることがあります。
1vcpuhcj51eomj1o31dnlqopu0
2ここで、vはランダムに選ばれた先頭の英字、cpuhcj51eomj1o31dnlqopu0(24文字)はハッシュ本体です。2つの部分の見た目が異なるのは、最初の文字が必ず英字になるためだけです。ハッシュ本体には英字と数字が混在することがあります。
システムがCUID2を使用する理由
- 調整が不要。 どのマシンでも、次の値を中央サーバーやデータベースに問い合わせることなく、単独で有効なIDを生成できます。
- 衝突耐性。 時刻、カウンター、ホストのフィンガープリント、ランダムエントロピーを混合するため、毎秒多数のIDを生成する場合でも、2台のマシンが同じIDを生成する可能性は極めて低くなります。
- URLに適している。 CUID2は小文字の英字と数字だけを使用するため、Webアドレスで使う際にエンコードする必要がありません。
- 高速でプライバシーを保てる生成。 このツールはブラウザー内でジェネレーターを実行するため、IDは即座に作成され、デバイスの外に出ることもありません。
CUID2のIDは、作成時刻の順に並べ替えることはできません。データベースの自動インクリメント番号や旧CUID(バージョン1)形式とは異なり、CUID2はタイムスタンプを見える形で保存せず、ハッシュの中に隠します。作成順にレコードを並べ替える必要があるアプリケーションでは、IDとは別にタイムスタンプ用のカラムを保存してください。
CUID2とUUIDと自動インクリメントIDの比較
| 機能 | CUID2 | UUID v4 | 自動インクリメント |
|---|---|---|---|
| 長さ | 25文字 | 36文字(ハイフンを含む) | 可変(通常は短い数値) |
| 文字セット | 小文字の英字と数字 | 十六進数字とハイフン | 桁 |
| 中央での調整が必要 | いいえ | いいえ | はい(データベースのシーケンス) |
| 作成時刻順に並べ替え可能 | いいえ | いいえ | はい |
| エンコードなしでURLに使用可能 | はい | はい | はい |
CUID2とUUID v4は、中央での調整なしにIDを生成するという同じ問題を解決します。CUID2はより短く、使用する文字セットも小さいため、読みやすく、URLに貼り付けやすくなっています。UUIDもWebアドレスで安全に使用できます。ハイフンはURLで予約されていない文字だからです。ただし、11文字長くなります。
主な用途
- 複数のサーバーが独立して行を挿入する分散データベースの主キー
- 複数のマイクロサービスにまたがって1つの処理を追跡するための、リクエストIDまたはトレースID
- 2つのファイルが互いに上書きしないようにする、アップロード用のファイル名
- WebアプリケーションのセッションIDまたはトークンID
- KafkaやRabbitMQなどのキュー内のメッセージID
短い歴史
元のCUID形式は、分散アプリケーション向けのUUIDの代替として、Eric Elliottによって2012年に公開されました。同じParalleldriveプロジェクトが公開したCUID2では、暗号学的ハッシュを中心に形式を再設計し、元のバージョンで公開されていた復元可能なタイムスタンプとカウンターを削除しました。このツールはCUID2のIDだけを生成します。
よくある質問
CUID(v1)とCUID2の違いは何ですか? CUID v1は、IDの中にタイムスタンプとカウンターを見える形で保存していたため、IDを並べ替えられましたが、いつ、何個のIDが作成されたかも漏れていました。CUID2では、これらの公開フィールドを一方向ハッシュに置き換えているため、IDから情報を読み戻すことはできません。
このツールのCUIDは作成時刻順に並べ替えられますか? いいえ。CUID2には復元可能なタイムスタンプがないため、文字列を見るだけで生成時刻の順にIDを並べることはできません。
生成されるIDの長さはどのくらいですか。長さを変更できますか? このツールは常に25文字のIDを生成します。このツールには別の長さを指定するオプションはありません。
異なる2台のマシンが同時に同じCUID2を生成することはありますか? 理論上は可能ですが、実際には極めて起こりにくいことです。各IDはホスト固有のフィンガープリントとランダムエントロピーを混合するため、独立したマシンが同じハッシュを生成する可能性は非常に低くなります。
このツールはサーバーにデータを送信しますか? いいえ。IDは、ローカルシステムの時計とブラウザーが提供する乱数を使用して、ブラウザー内で実行されるJavaScriptによって生成されます。何も送信されません。
CUID2をデータベースの主キーとして使用できますか?
はい。CUID2のIDは、中央のシーケンスに問い合わせることなくどのノードでも生成できるため、分散データベースの主キーとして適しています。挿入時刻順に自然に並ぶわけではないため、その順序が必要なアプリケーションでは、別途created_atカラムを保持してください。