UUID vs ULID 比較

UUIDとULIDを徹底比較。フォーマットの違い、ソート可能性、エンコード効率、データベースパフォーマンスの観点から、最適な識別子を選ぶための判断基準を解説します。

Comparison

詳細な説明

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 -- 主な違い:

  1. エンコード: ULIDはBase32(26文字)、UUIDは16進数(36文字)を使用し、IDあたり10文字の節約になります。URL、ログ、APIではこの差が積み重なります。
  2. ランダム性: ULIDは80ビットのランダム性を持つのに対し、UUID v7は62ビットです。同一ミリ秒内でのULIDの衝突確率はより低くなります。
  3. エコシステム: UUIDはIETF標準(RFC 9562)であり、事実上すべてのデータベース、言語、フレームワークでネイティブサポートされています。ULIDはコミュニティ仕様であり、サポートは拡大中ですが普遍的ではありません。
  4. 互換性: 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を使用します。

試してみる — UUID Generator

フルツールを開く