ULID 生成

UUIDの代替として使える、時刻順にソート可能なID「ULID」を一括生成します。

使い方のヒント

  • ULIDは先頭10文字がタイムスタンプ(生成時刻)、残り16文字がランダムな値で構成されています。同じミリ秒内に生成した場合を除き、文字列としてソートするだけで生成時刻順に並び替えられます。
  • データベースの主キーにUUID v4(完全ランダム)を使うと、インデックスの挿入位置がランダムになりB-treeインデックスの断片化が進みやすいという課題がありますが、ULIDは時刻順に並ぶため挿入位置が概ね連続し、この問題を緩和できます。
  • ULIDは26文字のCrockford Base32(`0`〜`9`・`A`〜`Z`から紛らわしいI・L・O・Uを除いた32文字)で表現されるため、UUID(36文字、ハイフン含む)より短く、大文字・小文字を区別しない環境でも安全に扱えます。
  • Nano ID・UUID v4との形式比較は、姉妹ツールのNano ID生成ページに掲載している比較表もあわせてご確認ください。

よくある質問

ULID(Universally Unique Lexicographically Sortable Identifier)は、UUIDと同様にグローバルに一意なIDを生成する仕組みでありながら、生成時刻の情報を含むため文字列としてソートするだけで時系列順に並べられるという特徴を持つ識別子の規格です。

最も大きな違いは「時刻順にソート可能かどうか」です。UUID v4は完全にランダムな128ビットの値のため生成順にソートできませんが、ULIDは先頭48ビットがミリ秒単位のタイムスタンプのため、文字列比較だけで生成時刻の順序が分かります。また表記もULIDは26文字のBase32、UUIDは36文字(ハイフン含む)の16進数という違いがあります。

UUID v4のような完全ランダムな値を主キーに使うと、新しい行が挿入される位置がインデックス内でランダムになり、B-treeインデックスの断片化やキャッシュ効率の低下を招くことがあります。ULIDは時刻順に並ぶ性質があるため、新しい行がインデックスの末尾付近に追加されやすく、この問題を緩和できるとされています。

先頭10文字が48ビットのミリ秒タイムスタンプ(西暦10889年頃まで表現可能)、残り16文字が80ビットのランダムな値です。合計128ビットとUUIDと同じビット数を持ちながら、時刻情報を内包している点がULIDの特徴です。
ツールくん

余談ですが ― IDの世界に「時系列」を持ち込んだULID

ULIDの仕様は2016年にAlizain Feerasta氏によって公開されました。当時すでにUUIDは分散システムでの一意なID生成の標準的な手段として広く使われていましたが、「完全にランダムであるがゆえにソートできない」という性質が、データベースのインデックス効率やログの時系列分析において不便であるという問題意識から生まれたとされています。

UUIDにも実はバージョン1(MACアドレス+タイムスタンプ)やバージョン7(2024年に標準化された、タイムスタンプ+ランダム値の組み合わせ)のように時刻情報を含むバリエーションが存在しますが、ULIDはUUIDの仕様(RFC 4122)とは独立した独自の規格として、より単純な設計とBase32によるコンパクトな表記を追求した点に特徴があります。

現在ではULIDは主要なプログラミング言語のほぼすべてに実装ライブラリが存在し、分散システムのイベントID・ログのトレースID・データベースの主キーなど、生成順序を保ちたい場面で広く採用されています。同時期に登場したUUID v7と設計思想が重なる部分も多く、両者は「ソート可能なUUID系識別子」という同じ課題への異なるアプローチとして併存しています。