ULID 生成

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

ULID生成とは

ULID生成とは、時刻順にソート可能なグローバル一意識別子「ULID(Universally Unique Lexicographically Sortable Identifier)」をまとめて発行することです。ULIDは26文字のCrockford Base32文字列で、先頭10文字が生成時刻を表すタイムスタンプ部、残り16文字が暗号学的に安全な乱数によるランダム部で構成されています。UUID v4のような完全ランダムな識別子と違い、生成した順番どおりに文字列としてソートできる点が最大の特徴です。

このツールはWeb Crypto APIの`crypto.getRandomValues()`を使ってランダム部を生成するため、疑似乱数ではなく暗号論的に安全な乱数源を利用しています。生成処理はすべてブラウザ内で完結し、入力した件数や生成結果がサーバーへ送信されることはありません。1回に最大1,000件までまとめて生成でき、大文字(仕様上の正準表記)と小文字のどちらの出力にも対応しています。

ULID生成の使い方

  1. 生成件数を入力する 一度に発行したいULIDの個数を「生成件数」に入力します。1〜1000件の範囲で指定できます。
  2. 小文字表示の要否を選ぶ URLやログに埋め込む際に小文字統一したい場合は「小文字で出力」にチェックを入れます。仕様上は大文字・小文字のどちらも有効な表記です。
  3. 「生成する」ボタンを押す ボタンを押すと現在時刻をタイムスタンプ部に使ったULIDが指定件数分まとめて一覧表示されます。
  4. 結果をコピーする 1件ずつの「コピー」、または一覧すべてを改行区切りでまとめてコピーする「すべてコピー」が使えます。

使いこなすためのヒント

  • 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生成が役立つ場面

データベースの主キー・レコードIDの発行

新規テーブルの主キーにULIDを採用する際、開発初期にテスト用のダミーレコードやシードデータへ投入するIDをまとめて用意できます。

イベント駆動システムのイベントID

メッセージキューや分散システムでイベントごとに一意なIDを付与する場合、時刻順に並ぶULIDならログを時系列で追いやすくなります。

ログ・トレースIDのサンプル作成

アプリケーションのログ基盤やトレーシングツールの動作確認・デモ用データとして、実際の形式に沿ったIDをすぐに用意できます。

他形式のIDとの比較検討

UUID v4やUUID v7、短縮URL向けのNano IDと迷っている場合は、実際の見た目や文字数を見比べたうえで採用を判断できます。比較はUUID生成UUID v7生成Nano ID生成の各ツールもあわせてご利用ください。

ULID生成の関連用語

ULID
Universally Unique Lexicographically Sortable Identifierの略。128ビットの一意な識別子でありながら、先頭48ビットに生成時刻を持つため文字列としてソートするだけで時系列順に並べられる規格です。
Crockford Base32
数字の`0`〜`9`とアルファベットの`A`〜`Z`から、見た目が紛らわしい`I`・`L`・`O`・`U`の4文字を除いた32文字で構成されるエンコード方式です。ULIDはこの方式で26文字に符号化されます。
単調性(monotonicity)
値が時間とともに常に増加し続ける性質のことです。ULIDは同じミリ秒内に複数生成すると順序が保証されませんが、仕様が定めるモノトニック生成の拡張実装を使うと同一ミリ秒内でも単調増加を維持できます。
UUID
Universally Unique Identifierの略。RFC 4122で規定された128ビットの一意識別子の規格で、36文字(ハイフン含む)の16進数表記が使われます。ULIDとは独立した別規格です。
分散システムでの一意ID
複数のサーバーやプロセスが中央の採番機に問い合わせることなく、それぞれ独立に重複しない識別子を生成できる仕組みのことです。ULIDやUUIDはこの用途のために生成時刻や乱数を組み合わせて衝突確率を極小化しています。
タイムスタンプ部
ULIDの先頭10文字にあたる部分で、生成時刻をミリ秒単位でCrockford Base32にエンコードした48ビットの値です。文字列比較だけで生成順序が分かる仕組みの核となる部分です。

よくある質問

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系識別子」という同じ課題への異なるアプローチとして併存しています。