はじめに
よくUUIDという言葉を耳にしますが、私はなんとなくUIDと同じ意味だと思っていました。
しかし、UUIDは重複する可能性があると聞き、驚愕したので調べてまとめました。
UUIDとは?
UUID(Universally Unique Identifier) は、「普遍的に一意な識別子」という意味で、重複することがほぼない(理論上は重複する可能性がゼロではないですが、実質的にはゼロと考えて問題ありません)一意なIDを生成する仕組みです。
重複するまでの期待値は230京回らしい
UUIDの特徴
- 長さ: 128ビット(16バイト)
- 表記: 32桁の16進数を、8-4-4-4-12の形式でハイフンで区切って表現
-
例:
550e8400-e29b-41d4-a716-446655440000
UUIDのメリット
- 分散システムでの一意性: 中央管理サーバーなしで、複数のシステムが独立してIDを生成できる
- 予測不可能性: ランダム性があるため、セキュリティ的にも安全
- 衝突確率の低さ: 天文学的な確率でしか重複しない
UIDとの違い
「UID」は User Identifier や Unique Identifier の略で、より広い意味での「一意な識別子」を指します。
主な違いをまとめると:
| 項目 | UUID | UID |
|---|---|---|
| 正式名称 | Universally Unique Identifier | User/Unique Identifier |
| 標準化 | RFC 4122で標準化されている | 特に標準化されていない |
| 生成方法 | アルゴリズムが規定されている | システムによって様々 |
| 用途 | グローバルに一意なIDが必要な場合 | システム内での一意性があれば十分な場合 |
つまり、UUIDはUIDの一種であり、より厳密な仕様に基づいた識別子と言えます。
UUIDのバージョン
UUIDには複数のバージョンがあり、それぞれ異なる生成方法を持っています。
UUID v1 (タイムスタンプベース)
- 生成方法: MACアドレス + タイムスタンプ
- 特徴: 時系列順にソート可能
- デメリット: MACアドレスが含まれるため、プライバシーの懸念がある
import uuid
# UUID v1を生成
uuid_v1 = uuid.uuid1()
print(uuid_v1)
# 例: 6ba7b810-9dad-11d1-80b4-00c04fd430c8
UUID v4 (ランダムベース)
- 生成方法: ランダムな値
- 特徴: 最もよく使われるバージョン
- メリット: 予測不可能で、プライバシーに配慮
import uuid
# UUID v4を生成
uuid_v4 = uuid.uuid4()
print(uuid_v4)
# 例: 550e8400-e29b-41d4-a716-446655440000
その他のバージョン
- UUID v3: MD5ハッシュベース(名前空間 + 名前)
- UUID v5: SHA-1ハッシュベース(名前空間 + 名前)
- UUID v6, v7, v8: 新しい仕様(RFC 4122 bis)
実務ではUUID v4が最も広く使われています。
UUIDを使う際の注意点
1. インデックスのパフォーマンス
UUIDはランダムな値なので、データベースのインデックスが断片化しやすく、連番のIDと比べてパフォーマンスが低下する可能性があります。
対策:
- 時系列順のUUID(v1やv7)を検討する
- パーティショニングを活用する
- 読み取りが多い場合は、別途連番のインデックスを追加する
2. ストレージ容量
UUIDは128ビット(16バイト)なので、INTEGERやBIGINTと比べてストレージを多く消費します。
| 型 | サイズ |
|---|---|
| INTEGER | 4バイト |
| BIGINT | 8バイト |
| UUID | 16バイト |
大量のレコードを扱う場合は、ストレージコストを考慮する必要があります。
UUIDが適している場面
- 分散システム: 複数のサーバーで独立してIDを生成する必要がある
- マイクロサービス: 各サービスが独立してIDを生成できる
- セキュリティが重要: IDの予測を防ぎたい場合(セッションIDなど)
- マージが発生する: 複数のデータベースを統合する可能性がある
- APIの公開ID: 連番だとシステムの規模が推測されてしまう
まとめ
- UUIDは、グローバルに一意な128ビットの識別子
- UIDは、より広い意味での一意な識別子で、UUIDはUIDの一種
- 実務ではUUID v4(ランダムベース)が最もよく使われる
- 分散システムやセキュリティが重要な場面で特に有用
- パフォーマンスやストレージ容量の観点では連番IDより不利な面もある