UUID(Universally Unique Identifier)とは、中央管理なしに、世界中で重複しない(事実上一意な)IDを生成するための識別子です。
128ビットの数値を16進数で表現し、「550e8400-e29b-41d4-a716-446655440000」のような形式になります。
Pythonの標準ライブラリ uuid モジュールを使えば、用途に応じた4種類のUUIDを簡単に生成できます。
目次
名前空間定数の一覧
UUIDバージョン3と5(名前ベース)を使用する際に指定する「名前空間(Namespace)」の定数は以下の通りです。
| 定数名 | 意味・用途 |
uuid.NAMESPACE_DNS | FQDN(完全修飾ドメイン名)を指定する場合 |
uuid.NAMESPACE_URL | URLを指定する場合 |
uuid.NAMESPACE_OID | ISO OID(オブジェクト識別子)を指定する場合 |
uuid.NAMESPACE_X500 | X.500 DN(識別名)を指定する場合 |
実装例1:ランダム生成 (v4) と 時刻ベース (v1)
一般的に最もよく使われるのは、完全ランダムな v4 です。
v1 はMACアドレスを含むため、生成元の特定が可能ですが、プライバシーの観点から注意が必要です。
ソースコード
import uuid
# --- 1. UUID v4 (ランダムベース) ---
# 乱数を使って生成します。衝突確率は天文学的に低く、汎用的なIDとして推奨されます。
# 例:WebアプリのセッションID、DBのプライマリキーなど
random_id = uuid.uuid4()
print("--- UUID v4 (Random) ---")
print(f"ID : {random_id}")
print(f"Type: {type(random_id)}")
print(f"Hex : {random_id.hex}") # ハイフンなしの文字列
# --- 2. UUID v1 (時刻 + MACアドレスベース) ---
# 現在時刻とマシンのMACアドレスを使って生成します。
# 生成順序をある程度保ちたい場合や、ノードを識別したい場合に使われます。
time_based_id = uuid.uuid1()
print("\n--- UUID v1 (Time + MAC) ---")
print(f"ID : {time_based_id}")
実行結果
--- UUID v4 (Random) ---
ID : a2c4e6b8-9012-4def-abcd-1234567890ab
Type: <class 'uuid.UUID'>
Hex : a2c4e6b890124defabcd1234567890ab
--- UUID v1 (Time + MAC) ---
ID : 123e4567-e89b-12d3-a456-426614174000
実装例2:特定の名前から生成 (v3, v5)
特定の文字列(ドメイン名やユーザーIDなど)を元に、常に同じUUIDを生成したい場合は、ハッシュ関数を利用する v3 (MD5) または v5 (SHA-1) を使用します。
セキュリティ強度の観点から、現在は v5 の使用が推奨されます。
ソースコード
import uuid
# ID生成の元ネタとなるドメイン名(シナリオ:社内APIの識別子作成)
target_domain = "api.internal-system.local"
# --- 1. UUID v3 (MD5ハッシュ) ---
# 名前空間(DNS)と文字列を渡して生成
generated_uuid_v3 = uuid.uuid3(uuid.NAMESPACE_DNS, target_domain)
# --- 2. UUID v5 (SHA-1ハッシュ) ---
# v3より衝突耐性が高いSHA-1を使用。こちらが推奨されます。
generated_uuid_v5 = uuid.uuid5(uuid.NAMESPACE_DNS, target_domain)
print(f"Target Domain: {target_domain}")
print("-" * 40)
print(f"v3 (MD5) : {generated_uuid_v3}")
print(f"v5 (SHA-1): {generated_uuid_v5}")
# 確認:同じ入力なら、何度実行しても同じUUIDになります
re_generated = uuid.uuid5(uuid.NAMESPACE_DNS, target_domain)
print(f"再生成確認 : {re_generated} (一致: {generated_uuid_v5 == re_generated})")
実行結果
Target Domain: api.internal-system.local
----------------------------------------
v3 (MD5) : 6fa459ea-ee8a-3ca4-894e-db77e160355e
v5 (SHA-1): 886313e1-3b8a-5372-9b90-0c9aee199e5d
再生成確認 : 886313e1-3b8a-5372-9b90-0c9aee199e5d (一致: True)
解説
バージョンの使い分け
- uuid4 (推奨): 重複しないIDが欲しいだけの時。最も一般的。
- uuid5: 「入力データ A」に対して、常に「決まったID B」を割り当てたい時(一貫性が必要な場合)。
- uuid1: 生成時刻の情報が必要な時や、MACアドレスを利用して物理マシンを特定したい時(※プライバシーに注意)。
型について
uuid.uuidX() が返すのは文字列ではなく UUID オブジェクトです。
文字列としてDBに保存したい場合は str(u_obj) を、ハイフン抜きの文字列が欲しい場合は u_obj.hex を使用します。
