コンテンツにスキップ

KSUIDジェネレーター - ソート可能なユニークな識別子を作成

K-ソート可能なユニーク識別子(KSUID)をオンラインで生成します。タイムスタンプとランダムなペイロードを組み合わせて、時間順にソートでき衝突しにくいIDを瞬時に作成します。分散システムやデータベースの主キー、マイクロサービスのイベントIDとしてUUIDの代替に利用できます。

KSUIDジェネレーター

ローディング計算機...
📚

ドキュメンテーション

KSUID生成ツール

KSUID(K-Sortable Unique Identifier)は、データベースの行、ログエントリ、APIリクエストなどのレコードを識別するために使われる27文字のコードです。タイムスタンプとランダムデータを組み合わせるため、後で作成されたIDは、各IDが実質的に一意である一方で、必ず先に作成されたIDの後にソートされます。このツールはブラウザー上で1つのKSUIDを生成し、ユーザーがコピーできるようにします。

KSUIDは何で構成されているか?

KSUIDの長さは20バイトで、2つの部分に分かれています。

  • タイムスタンプ(4バイト): KSUIDエポックと呼ばれる固定の開始時点からの経過秒数。
  • ランダムペイロード(16バイト): ブラウザーの暗号学的乱数生成器が生成するデータ。

その20バイトを、base62エンコーディングを使ってテキストに変換します。これは62文字で数値を表す方式で、数字0-9、大文字のA-Z、小文字のa-zを使用します。結果は必ず27文字になるようにパディングされます。例:0qjBBlJIfbVLKwnJn4xpLGDr00e。

タイムスタンプが先頭にあるため、1秒違いで作成された2つのKSUIDをプレーンテキストとして比較すると、通常は作成時刻と同じ順序にソートされます。末尾の16バイトはランダムなので、同じ秒に作成された2つのKSUIDも、ほぼ確実に異なります。

KSUIDエポック

ほとんどのコンピューターシステムは、1970年1月1日(「Unixエポック」)からの経過秒数で時刻を数えます。KSUIDでは、別の開始時点であるKSUIDエポックを使用します。これはUnixエポックから1,400,000,000秒後、つまりUTCで2014年5月13日 16:53:20です。

開始時点を後にすると、4バイトのタイムスタンプフィールドが容量を使い切るまで、より実用的な年数をカバーできます。4バイト(32ビット)のカウンターが保持できる秒数は最大4,294,967,295秒です。KSUIDエポックから数えると、この期間はおよそ2150年6月19日に尽きます。

KSUIDの式

KSUID文字列は3つの手順で構成されます。

  1. タイムスタンプ値を求める:

    T = floor(current_unix_time_in_seconds) − 1,400,000,000

  2. 暗号学的に安全な乱数生成器を使って、16個のランダムバイトRを生成する。

  3. 4バイトのタイムスタンプと16個のランダムバイトを1つの20バイトのブロックに結合し、そのブロックをbase62でエンコードして、結果を27文字になるようにパディングする。

    KSUID = Base62( T ‖ R )

ここで‖は「一方をもう一方の後ろに置く」ことを意味します。タイムスタンプのバイトが常に先に来るため、最終的な文字列は時刻順に正しくソートされます。

計算例

KSUIDのタイムスタンプ部分が100000000だとします。KSUIDエポックはUnixエポックから1,400,000,000秒後なので、このタイムスタンプはUTCで2017年7月14日 02:40:00を表します。

このタイムスタンプと16バイトのシーケンス1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16を組み合わせます(ここでは例を再現可能にするために使用しています。実際の生成器では代わりにランダムバイトを使用します)。base62でエンコードすると、次のようになります。

0qjBBlJIfbVLKwnJn4xpLGDr00e

この文字列の長さは27文字で、数字と英字だけで構成されているため、URLやファイル名にそのまま安全に使用できます。

KSUID生成ツールの使い方

  1. KSUID生成ページを開きます。
  2. 「Generate KSUID」ボタンを選択します。
  3. ツールは現在時刻と新しいランダムバイトを使って新しいKSUIDを1つ作成し、ページに表示します。
  4. 「Copy KSUID」ボタンを選択して、値をクリップボードにコピーします。
  5. 「Reset」を選択して結果を消去します。ResetボタンはKSUIDが生成された後にのみ表示されます。

「Generate KSUID」をクリックするたびに、識別子が必ず1つ生成されます。複数のKSUIDを作成するには、新しいKSUIDごとにボタンをもう一度クリックします。このツールには一括生成モードやファイルエクスポート機能は組み込まれていません。

この生成器は、最新のブラウザーに組み込まれているWeb Crypto APIを使用します。そのAPIを利用できない場合、暗号学的に安全でない乱数生成器では推測しやすい識別子や衝突する識別子が生成される可能性があるため、ツールはIDを生成せずにエラーを表示します。

KSUIDとUUIDの比較

UUID(Universally Unique Identifier)は、一般的な別の識別子形式です。最も広く使われているUUID v4は36文字で、ほぼすべてがランダムビットで構成されているため、2つのUUIDを見てもどちらが先に作成されたかは分かりません。

KSUIDには3つの違いがあります。

  • 時刻順にソートできる。 先頭のタイムスタンプバイトにより、KSUID文字列を通常のアルファベット順でソートすると、作成時刻順にもなります。
  • 短い。 KSUIDは27文字で、標準的なUUIDの36文字より短くなっています。
  • 区切り文字がない。 UUIDは通常、ハイフン(xxxxxxxx-xxxx-...)を入れて記述しますが、KSUIDにはありません。

どちらの形式も、中央サーバーに確認せず、異なるコンピューター上で独立して生成できます。そのため、共有データベースで自動インクリメントカウンターを使う場合のボトルネックを、どちらも回避できます。

よくある質問

KSUIDは何の略ですか? K-Sortable Unique Identifierです。「K」はソート可能であることを指します(形式を作成した企業Segmentの設計初期メモでは「kind of sortable」と表現されています)。

KSUIDの長さはどのくらいですか? 27文字で、base62(数字0-9、大文字、小文字)を使ってエンコードされます。

KSUIDエポックとは何ですか? UTCで2014年5月13日 16:53:20です。標準的なUnixエポック1970年1月1日から1,400,000,000秒後に当たります。

2つのKSUIDが衝突することはありますか? 可能性は極めて低いです。各KSUIDには、暗号学的に安全な乱数生成器で生成された16個のランダムバイト(128ビット)が含まれています。同じ秒に多数のKSUIDを生成しても、偶然に一致する確率は天文学的に小さいままです。

KSUIDから作成時刻を復元できますか? はい。デコードした値の最初の4バイトがタイムスタンプです。その数値の秒数をKSUIDエポックに加えると、元の作成時刻が得られます。

このツールは多数のKSUIDを一度に生成できますか? いいえ。「Generate KSUID」ボタンを1回クリックするごとに、KSUIDを1つ生成します。数量入力、カスタムタイムスタンプフィールド、エクスポート/ダウンロード機能はありません。

KSUIDをURLに入れても安全ですか? はい。base62エンコーディングは数字と英字だけを使用するため、KSUIDをURL、ファイル名、データベースキーに含める際に追加のエスケープは必要ありません。

参考文献

  1. SegmentのKSUID GitHubリポジトリ:https://github.com/segmentio/ksuid
  2. Peter Bourgonによる"Generating good unique identifiers":https://peter.bourgon.org/blog/2019/05/20/generating-good-unique-ids.html