コンテンツにスキップ

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

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

KSUIDジェネレーター

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

ドキュメンテーション

KSUID生成ツール

KSUID(K-Sortable Unique Identifier)は、データベースの行、ログエントリ、APIリクエストなどのレコードにラベルを付けるために使われる27文字のコードです。タイムスタンプとランダムなデータを組み合わせているため、IDはおおよそ生成時刻順に並び、それでいて一つ一つが実質的に一意です。このツールはブラウザー上で単一のKSUIDを生成し、ユーザーがコピーできるようにします。

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

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

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

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

タイムスタンプが先頭にあるため、一秒離れて作られた二つのKSUIDは、通常、単純な文字列として比較したときも作成時刻と同じ順序で並びます。ただし順序は生成するコンピューターの時計に依存するため、厳密に保証されるものではありません。末尾の16バイトはランダムなので、同じ秒に作られた二つのKSUIDでも、ほぼ確実に異なります。

KSUIDエポック

多くのコンピューターシステムは、1970年1月1日(「Unixエポック」)からの経過秒数で時間を数えます。KSUIDは別の起点であるKSUIDエポックを使います。これはUnixエポックの1,400,000,000秒後で、リファレンス実装が覚えやすい値として選んだものであり、2014年5月13日 16:53:20 UTCにあたります。

より後の起点を使うと、4バイトのタイムスタンプ欄は、容量が尽きるまでにより多くの有用な年数をカバーできます。この形式の作者は、これを100年以上の寿命を提供すると説明しています。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. 「KSUIDを生成」ボタンを選択します。
  3. ツールは現在時刻と新しいランダムバイトを使って新しいKSUIDを1つ作成し、ページに表示します。
  4. 「KSUIDをコピー」ボタンを選択して、値をクリップボードにコピーします。
  5. 「リセット」を選ぶと結果がクリアされます。もう一度「KSUIDを生成」を選ぶと、新しいKSUIDが作成されます。

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

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

KSUIDとUUIDの比較

UUID(Universally Unique Identifier)は、一般的な代替の識別子形式です。バージョン4のUUIDは122ビットのランダムビットを持ち、タイムスタンプを含まないため、二つのUUIDからどちらが先に作られたかは分かりません。通常のテキスト形式では、UUIDは36文字で、ハイフンで区切られたグループに32桁の十六進数の数字が並びます。

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

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

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

よくある質問

KSUIDは何の略ですか? K-Sortable Unique Identifierです。この形式はSegment社が作成し、同社がリファレンスのGo実装を公開しています。

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

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

二つのKSUIDが衝突することはありますか? 極めて起こりにくいです。各KSUIDには、暗号学的に安全な乱数生成器で作られた16バイト(128ビット)のランダムなバイト列が含まれます。これはバージョン4のUUIDが持つ122ビットのランダムビットに比べ、64倍の数の空間にあたります。同じ秒に多数のKSUIDを生成しても、偶然二つが一致する確率は天文学的に小さいままです。

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

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

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

参考文献

  1. Segment。ksuid: K-Sortable Globally Unique IDs(README)。github.com/segmentio/ksuid — 20バイトのレイアウト、27文字のbase62テキスト、2014年5月のエポック(100年以上の寿命)、128ビットのランダムビット、緩やかな時間順序。
  2. Segment。ksuid.go。リファレンス実装のソース — エポック定数1400000000("14e8")。
  3. IETF。RFC 9562: Universally Unique IDentifiers (UUIDs)。rfc-editor.org — 十六進数とハイフンのテキスト形式、およびバージョン4のUUIDが持つ122ビットのランダムビット。