分散システムのための効率的なCUID生成器
衝突耐性を持つCUID2形式の一意識別子を、ブラウザ内の処理だけで即座に生成する無料ツール。データベースの主キーや分散システムのレコードID、Webアプリケーションのオブジェクト識別子として使え、時系列でソート可能かつURLにも安全に使える文字列を作成できる。
CUIDジェネレーター
衝突の可能性が低いIDをすばやく簡単に生成します。
ドキュメンテーション
CUIDとは?
CUID(衝突耐性のある一意識別子)は、レコード、ファイル、イベントに付けるラベルとして使われる英数字の短い文字列で、同じ名前を持つ項目が二つ存在しないようにするためのものです。このツールは、この形式の現行バージョンであるCUID2を、@paralleldrive/cuid2ライブラリを使って生成します。各IDは25文字で、小文字の英字と数字だけを含み、すべてブラウザー内で作成されます。サーバーには何も送信されません。
このCUID生成ツールの使い方
- Generate New CUIDをクリックしてIDを生成します。
- Copy to Clipboardをクリックしてコピーします。
- IDをデータベース、ファイル名、またはアプリケーションに貼り付けます。
- もう一度Generateをクリックすると、別のIDが生成されます。異なるCUID2値の間で衝突する可能性は極めて低いものの、数学的に不可能ではありません。
生成されたIDはページのURLにも保存されるため、結果へのリンクを共有したり、ブックマークしたりできます。
CUID2の構造と式
CUID2は次のように構成されます。
1id = randomLetter + base36( SHA3-512( time + entropy + counter + fingerprint ) ).substring(1, length)
2ハッシュ関数は、四つの非公開の入力(現在時刻、セッションごとのカウンター、ホストマシンのフィンガープリント、ランダムなエントロピー)を混ぜ合わせ、SHA3-512に通します。結果は36進数(数字0-9と英字a-z)に変換され、指定の長さに切り詰められます。ライブラリの既定は24文字です。このツールは25文字を指定しています。
先頭の文字だけは独立しています。すべてのIDが数字ではなく英字で始まるように、先頭にランダムな英字が置かれます。ライブラリの作者によれば、この先頭の英字によって、IDはJavaScriptやHTML/CSSで使える識別子になります。先頭の英字より後ろの文字は、すべて一続きの不透明なハッシュ本体の一部です。個別の区画はありません。
ハッシュは一方向にしか機能しないため、完成したIDから入力値を取り出すことはできません。CUID2には復元可能なタイムスタンプ、カウンター、フィンガープリントがありません。これは意図的なプライバシーおよびセキュリティ上の選択です。IDだけから、いつ、どこで作成されたかを知ることはできません。
例
このツールでIDを生成すると、次のようになることがあります。
1vcpuhcj51eomj1o31dnlqopu0
2ここでvはランダムな先頭の英字、cpuhcj51eomj1o31dnlqopu0(24文字)はハッシュ本体です。先頭の文字は常に英字です。ハッシュ本体には英字と数字が混在することがあります。
システムが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を生成するという同じ問題を解決します。UUIDは、「十六進数とハイフン」の文字列形式で書かれた128ビットの値で、32桁の十六進数と4個のハイフンからなります。CUID2はより短く、使う文字の種類も少ないため、読みやすく、URLに貼り付けやすくなります。
主な用途
- 複数のサーバーが独立して行を挿入する分散データベースの主キー
- 複数のマイクロサービスにまたがって1つの処理を追跡するための、リクエストIDまたはトレースID
- 2つのファイルが互いに上書きしないようにする、アップロード用のファイル名
- WebアプリケーションのセッションIDまたはトークンID
- KafkaやRabbitMQなどのキュー内のメッセージID
短い歴史
元のCUID形式は、分散アプリケーション向けのUUIDの代替として、Eric Elliottによって作られました。現在はCUID2に置き換えられ、非推奨です。同じ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カラムを保持してください。
参考文献
- Paralleldrive。Cuid2(README)。github.com/paralleldrive/cuid2 — エントロピー源、先頭の英字、36進数の出力、既定の長さ24、復元できない入力、
createdAtに関する助言。 - Paralleldrive。Cuid(非推奨)。github.com/paralleldrive/cuid — Eric Elliottによる元のCUID。Cuid2に置き換えられ、非推奨。
- IETF。RFC 9562: Universally Unique IDentifiers (UUIDs)。rfc-editor.org — 128ビットのUUID、十六進数とハイフンの文字列形式、中央での登録は不要。