UUIDの基本
UUID (Universally Unique Identifier) は、世界中で一意となるように設計された128ビットの識別子です。日本語では「汎用一意識別子」と呼ばれています。
UUIDは以下のような形式で表現されます。
550e8400-e29b-41d4-a716-446655440000
この文字列は、8-4-4-4-12桁の16進数をハイフンで区切った形式になっています。
なぜUUIDが必要なのか
従来のデータベースでは、連番のIDを使用することが一般的でした。しかし、分散システムやマイクロサービスアーキテクチャでは、以下の課題が生じます。
- 複数のサーバーで同時にIDを生成する際、重複を避けるための調整が必要
- データベースへの問い合わせなしにIDを生成できない
- システム間でデータを統合する際にID衝突が発生する
UUIDを使用することで、これらの問題を解決できますね。中央管理なしで一意なIDを生成できるため、分散環境でも安全に利用できます。
UUIDのバージョン
UUIDには複数のバージョンがあり、それぞれ異なる生成方法を持っています。
Version 1: タイムスタンプベース
生成時刻とMACアドレスを組み合わせて生成します。
特徴
- 時系列でソート可能
- MACアドレスが含まれるため、生成元が特定できる
- プライバシーの懸念がある
Version 3/5: ハッシュベース
名前空間と名前を組み合わせてハッシュ化します。Version 3はMD5、Version 5はSHA-1を使用します。
特徴
- 同じ入力からは常に同じUUIDが生成される
- 冪等性が必要な場合に有効
Version 4: ランダム
122ビットがランダムに生成されます。現在最も広く使われているバージョンです。
特徴
- 実装がシンプル
- プライバシー保護に優れる
- 衝突の可能性は極めて低い(約2^61個生成して初めて衝突確率が50%)
Version 6/7: 改良版
Version 1の改良版で、より優れた時系列ソート性能を持ちます。
バージョンの選び方
一般的な用途ではVersion 4が推奨されます。データベースのインデックス性能を重視する場合はVersion 7を検討しましょう。
実装例
各プログラミング言語でのUUID生成方法を見てみます。
Python
import uuid
# Version 4(ランダム)
id = uuid.uuid4()
print(id) # 550e8400-e29b-41d4-a716-446655440000
# Version 5(名前ベース)
namespace = uuid.NAMESPACE_DNS
name = "example.com"
id = uuid.uuid5(namespace, name)
JavaScript/TypeScript
import { v4 as uuidv4 } from 'uuid';
const id = uuidv4();
console.log(id);
Java
import java.util.UUID;
UUID id = UUID.randomUUID();
System.out.println(id);
UUIDの構造
UUIDの内部構造を理解すると、より効果的に活用できます。
メリットとデメリット
メリット
- 分散環境で中央管理なしに一意なIDを生成可能
- データベースへの問い合わせが不要
- システム間のデータ統合が容易
- 予測不可能性(セキュリティ向上)
デメリット
- 連番IDと比較してサイズが大きい(128ビット vs 32/64ビット)
- ランダムなためデータベースインデックスの性能に影響する可能性
- 人間が読みにくい
データベースでの使用時の注意点
UUIDをデータベースの主キーとして使用する場合、パフォーマンスに影響する可能性があります。
対策
- Version 7など時系列順序を持つバージョンを使用する
- バイナリ形式で保存する(文字列形式の36バイトではなく16バイト)
- 適切なインデックス戦略を採用する
-- PostgreSQLでの例
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name VARCHAR(100),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
まとめ
UUIDは分散システムにおいて非常に有用な識別子です。適切なバージョンを選択することで、システムの要件に合わせた実装が可能になります。
- 一般的な用途: Version 4
- 時系列ソートが必要: Version 7
- 冪等性が必要: Version 5
- レガシーシステム: Version 1
現代のアプリケーション開発において、UUIDは標準的な選択肢の一つとなっていますね。