ULIDとは?
ULID(Universally Unique Lexicographically Sortable Identifier) はUUIDの制限を克服するために設計された128ビットの識別子フォーマットです。構成は以下の通りです:
- Timestamp: 48ビットのミリ秒精度Unix時間
- Randomness: 80ビットの暗号学的に安全なランダムデータ
- Encoding: Base32表現(26文字)
フォーマット例: 01ARZ3NDEKTSV4RRFFQ69G5FAV
ULIDの動作方法
- タイムスタンプ用に48ビットを生成(ミリ秒単位のUnix時間)
- 80ビットの暗号学的に安全なランダムデータを生成
- タイムスタンプ(最上位)とランダム性(最下位)を結合
- CrockfordのBase32アルファベットを使って128ビット全体をエンコード
- 結果は26文字の文字列(最初の10文字がタイムスタンプ、最後の16文字がランダム性)
利点と考慮点
Advantages | Considerations |
---|---|
|
|
ULIDの構造
Component | Bits | Characters | Description |
---|---|---|---|
Timestamp | 48ビット | 10文字 | Base32でエンコードされたUnixタイムスタンプ(ミリ秒) |
Randomness | 80ビット | 16文字 | Base32でエンコードされたランダムバイト |
ULIDとUUIDの比較
Feature | ULID | UUID v1 | UUID v4 | UUID v7 |
---|---|---|---|---|
Size | 128ビット | 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アルファベット
エンコード値 | Character | Notes |
---|---|---|
0-9 | 0-9 | 10進数字 |
10-31 | A-Z | 読みやすさのためI、L、O、Uを除外 |
文字: 0123456789ABCDEFGHJKMNPQRSTVWXYZ
このエンコーディングはデコード時に大文字・小文字を区別しません(ただしULIDは通常大文字で生成されます)。