ULIDジェネレーター

タイムスタンプとランダム性を持つ辞書式にソート可能な識別子を生成

これらの例を試してください:

ULIDとは?

ULID(Universally Unique Lexicographically Sortable Identifier) はUUIDの制限を克服するために設計された128ビットの識別子フォーマットです。構成は以下の通りです:

  • Timestamp: 48ビットのミリ秒精度Unix時間
  • Randomness: 80ビットの暗号学的に安全なランダムデータ
  • Encoding: Base32表現(26文字)

フォーマット例: 01ARZ3NDEKTSV4RRFFQ69G5FAV

ULIDの動作方法

  1. タイムスタンプ用に48ビットを生成(ミリ秒単位のUnix時間)
  2. 80ビットの暗号学的に安全なランダムデータを生成
  3. タイムスタンプ(最上位)とランダム性(最下位)を結合
  4. CrockfordのBase32アルファベットを使って128ビット全体をエンコード
  5. 結果は26文字の文字列(最初の10文字がタイムスタンプ、最後の16文字がランダム性)

利点と考慮点

AdvantagesConsiderations
  • 辞書式にソート可能
  • URLセーフな文字セット
  • 特別なエンコーディングは不要
  • Case-insensitive
  • プライバシーの懸念なし
  • 新しく、あまり広く使われていない
  • ライブラリのサポートが限定的
  • UUIDとの互換性なし
  • 1970年以前には戻れない

ULIDの構造

ComponentBitsCharactersDescription
Timestamp48ビット10文字Base32でエンコードされたUnixタイムスタンプ(ミリ秒)
Randomness80ビット16文字Base32でエンコードされたランダムバイト

ULIDとUUIDの比較

FeatureULIDUUID v1UUID v4UUID v7
Size128ビット128ビット128ビット128ビット
文字列の長さ26文字36文字36文字36文字
Time-based
自然なソート
URLセーフ
MACアドレスの露出
ランダムコンポーネント
標準的な規格⚠️ ドラフト

一般的な使用例

  • データベースの主キー: パフォーマンス最適化されたインデックス
  • 分散システム: コーディネーション不要の生成
  • APIs: クリーンでURLセーフな識別子
  • 時系列データ: ネイティブの時系列順序付け
  • ログシステム: ソート可能なイベント識別子
  • モダンなアプリケーション: UUIDの制限が問題となる場所

なぜULIDを選ぶのか?

  • Sortability: 作成時間で辞書式にソートされる
  • URLの安全性: UUIDのハイフンとは異なりURLエンコードが不要
  • Compactness: 26文字対UUIDの36文字
  • 大文字・小文字を区別しない: ユーザー入力エラーを減らす
  • Monotonicity: 同じミリ秒内での単調ソートがオプションで可能
  • 特殊文字なし: シンプルで英数字のみのフォーマット

よくある質問

ULIDはUUID v7とどう違う?

両者ともにソート可能なUnixタイムスタンプを使用し、ランダムな要素を持っています。主な違いはエンコーディング(Base32対16進数)、フォーマット(26文字対36文字)、および標準化(UUID v7はドラフトRFC仕様にあります)。

ULIDから作成時間を抽出できる?

はい。最初の10文字はミリ秒精度のUnixタイムスタンプを表し、デコードして標準的な日時に変換できます。

ULIDはUUIDのデータベースフィールドと互換性がある?

いいえ。ULIDは異なるフォーマットを使用しており、ネイティブのUUIDデータベース型ではなく文字列またはバイナリデータとして保存する必要があります。

ULIDの単調性とは何ですか?

一部のULID実装では、同じミリ秒内で作成されたULIDのランダムコンポーネントをインクリメントすることで、連続したソート順を保証する単調オプションを提供しています。

ULIDはどの文字セットを使用していますか?

ULIDはCrockfordのBase32エンコーディング(0-9、A-ZのうちI、L、O、Uを除く)を使用しており、IDを手動で読み取ったり入力したりする際の混乱や転記ミスを最小限に抑えるよう設計されています。

Resources

CrockfordのBase32アルファベット

エンコード値CharacterNotes
0-90-910進数字
10-31A-Z読みやすさのためI、L、O、Uを除外

文字: 0123456789ABCDEFGHJKMNPQRSTVWXYZ

このエンコーディングはデコード時に大文字・小文字を区別しません(ただしULIDは通常大文字で生成されます)。