UUID vs ULID 比較
UUIDとULIDを徹底比較。フォーマットの違い、ソート可能性、エンコード効率、データベースパフォーマンスの観点から、最適な識別子を選ぶための判断基準を解説します。
詳細な説明
ULID(Universally Unique Lexicographically Sortable Identifier)は2016年に、ソート可能性と可読性を重視したUUIDの代替として作成されました。UUID v7の導入により、両フォーマットの機能は大きく重複するようになりました。
フォーマット比較:
| 特性 | UUID | ULID |
|---|---|---|
| サイズ | 128ビット | 128ビット |
| 文字列長 | 36文字(ハイフン付き) | 26文字(Crockford Base32) |
| ソート可能 | v7のみ | 常にソート可能 |
| タイムスタンプ | v7: 48ビットms | 48ビットms |
| ランダム性 | v4: 122ビット, v7: 62ビット | 80ビット |
| エンコード | 16進数 | Crockford Base32 |
ULIDの構造(128ビット):
01AN4Z07BY 79KA1307SR9X4MV3
|----------| |----------------|
Timestamp Randomness
48 bits 80 bits
(10 chars) (16 chars)
ULIDは 01ARZ3NDEKTSV4RRFFQ69G5FAV のようになります。ハイフンなし、大文字、26文字です。Crockford Base32エンコーディングでは、I、L、O、Uを除外して1、l、0、不適切な単語との混同を防いでいます。
UUID v7 vs ULID -- 主な違い:
- エンコード: ULIDはBase32(26文字)、UUIDは16進数(36文字)を使用し、IDあたり10文字の節約になります。URL、ログ、APIではこの差が積み重なります。
- ランダム性: ULIDは80ビットのランダム性を持つのに対し、UUID v7は62ビットです。同一ミリ秒内でのULIDの衝突確率はより低くなります。
- エコシステム: UUIDはIETF標準(RFC 9562)であり、事実上すべてのデータベース、言語、フレームワークでネイティブサポートされています。ULIDはコミュニティ仕様であり、サポートは拡大中ですが普遍的ではありません。
- 互換性: ULIDはUUIDカラムに格納可能(両方128ビット)ですが、文字列表現が異なるため混乱の原因になり得ます。
ULIDを選ぶべき場合: 文字列長が重要(URL、ユーザー向けID)、データベースネイティブのUUIDサポートが不要、エコシステムが既にULIDライブラリを使用している場合にULIDを選択してください。
UUID v7を選ぶべき場合: データベースとの幅広い互換性(PostgreSQLの uuid 型、MySQLの BINARY(16))、標準準拠が重要、ツールが既にUUIDフォーマットを理解している場合にUUID v7を選択してください。
パフォーマンス: 両者とも時刻順序付きであるため、データベースインデックスのパフォーマンスは同等です。バイナリでのストレージコストは両方128ビット(16バイト)で同一です。唯一の違いは文字列表現のサイズです。
ユースケース
UUIDとULIDの選択は通常、エコシステムの制約に依存します。ネイティブUUIDカラム型を持つPostgreSQLを多用するバックエンドにはUUID v7を、より短くURL安全な識別子が有用なシステムにはULIDを使用します。