ULID生成ツール(時系列ソート可能な一意ID・一括生成)

ULID生成ツール

生成条件

生成結果

1

ULID生成ツールについて

概要

ULIDジェネレーターは、Universally Unique Lexicographically Sortable Identifier(ULID)を生成するオンラインツールです。UUIDの代替として、時系列ソート可能な一意識別子を一括生成できます。

UUID v4はランダム性が高く優れた識別子ですが、生成順とソート順が一致しないためDBの主キーに使うとインデックスが断片化しやすいという弱点があります。ULIDは先頭にミリ秒精度のタイムスタンプを埋め込むことでこの弱点を解消しつつ、UUIDと同等の衝突耐性を維持した識別子です。本ツールはブラウザ内で完結して生成するため、外部にデータを送信せずにその場でまとめて取得できます。

使い方

  1. 1生成件数を指定します。
  2. 2「基準日時(タイムスタンプ)」に基準となる時刻(ミリ秒)を設定します(デフォルトは現在時刻)。
  3. 3同一ミリ秒内でも値を単調増加させたい場合は「単調増加」を有効にします。
  4. 4「生成」ボタンをクリックします。

補足: 過去や未来の特定時刻を起点にしたULIDをまとめて発行したい場合は、「基準日時(タイムスタンプ)」に任意の日時を指定してから生成してください。テストデータの投入順序を制御したい場合などに便利です。

仕様・用語解説

  • ULID仕様: 128ビット=48ビットのタイムスタンプ(ミリ秒精度)+80ビットのランダム値で構成されます。Crockford's Base32でエンコードされた26文字の文字列(例: 01ARZ3NDEKTSV4RRFFQ69G5FAV)です。
  • 辞書順ソート: ULIDの先頭10文字が時刻を表すため、辞書順ソート(文字列比較)がそのまま時系列ソートになります。DBインデックスの局所性が高まりパフォーマンスが向上します。
  • 「単調増加」機能: 同一ミリ秒内に複数のULIDを生成した場合、ランダム部分をインクリメントして単調増加を保証します。イベントの順序を厳密に保持したい場合に使用します。
  • UUIDとの比較: UUID v4はランダムな文字列のため辞書順ソートに時系列の意味がありませんが、ULIDは辞書順ソート=時系列ソートになります。RDBMSのクラスタードインデックスで特に有効です。
  • Crockford's Base32: I, L, O, U を除外した32文字セットを使用。視覚的に紛らわしい文字を排除し、人間が読みやすい形式にしています。
  • 衝突確率: 同一ミリ秒内でも80ビットのランダム部分により、実用上十分な低確率でしか衝突しません。単調増加を有効にすればさらに同一プロセス内での重複を排除できます。
  • タイムスタンプ部分の復元: ULIDの先頭10文字(Base32でエンコードされた48ビット)をデコードすると、生成時刻(UNIXエポックからのミリ秒)を逆算できます。ログの発生時刻を推定する際にも利用できます。

ユースケース

  • 時系列順のログIDやイベントIDの生成。
  • RDBMSのプライマリキーとしてインデックス効率を高めたい場合。
  • ファイル名や一時トークンの一意識別子として活用。
  • UUID v7との比較検討。どちらも時系列ソート可能だが、ULIDはCrockford's Base32で26文字、UUID v7はハイフン区切りの36文字という違いがある。
  • 分散システムにおいて、複数ノードで採番してもソート順とおおよその発生順が保たれる識別子が必要な場合。
  • テストフィクスチャで、生成時刻をずらした複数のULIDをまとめて用意し、時系列順の表示ロジックを検証したい場合。

よくある質問

ULIDとUUIDの違いは何ですか
最大の違いはソート可能性です。UUID v4は完全にランダムなため生成順と文字列の並び順が一致しませんが、ULIDは先頭48ビットがミリ秒タイムスタンプなので、文字列としてソートするとほぼ生成順に並びます。長さもUUID(ハイフン込み36文字)に対しULIDは26文字と短くなります。
なぜULIDは辞書順ソートで時系列順に並ぶのですか
ULIDの先頭10文字はUNIXエポックからのミリ秒数をCrockford's Base32でエンコードした値です。Base32は桁の重みが大きい文字ほど先頭に来るよう設計されているため、生成時刻が新しいほど先頭文字列が大きくなり、通常の文字列比較(辞書順ソート)がそのまま時系列順と一致します。
ULIDの文字列からタイムスタンプ(生成時刻)を逆算できますか
はい。先頭10文字をCrockford's Base32としてデコードすれば、生成時に使われたミリ秒単位のUNIXタイムスタンプを復元できます。ランダム部分にあたる残り16文字からは時刻情報は得られません。
生成したULIDが重複することはありますか
理論上は完全にゼロではありませんが、80ビットのランダム部分があるため実用上無視できるほど低い確率です。同一ミリ秒内で連続生成する場合に厳密な重複回避と順序保証を求めるなら、「単調増加」オプションを有効にしてください。
「単調増加」を有効にするとどう変わりますか
同一ミリ秒内で複数生成した際に、2件目以降はランダム部分を1ずつインクリメントします。これにより同一タイムスタンプ内でも生成順どおりに文字列がソートされるようになり、イベントログのような順序が重要な用途に適しています。
既存システムのUUID列をULIDに移行できますか
ULIDは128ビットの値なのでUUID型のカラムにバイナリ表現として格納すること自体は可能ですが、文字列表現の見た目やハイフンの有無が異なるため、既存のUUID文字列との単純な置き換えにはアプリケーション側の変換ロジックが必要です。移行前に既存コードがUUID形式の文字列(ハイフン区切り36文字)を前提にしていないか確認してください。