【Python】UUIDの生成と種類の使い分け(v1, v4, v3, v5):名前空間と一意性

UUID(Universally Unique Identifier)とは、中央管理なしに、世界中で重複しない(事実上一意な)IDを生成するための識別子です。

128ビットの数値を16進数で表現し、「550e8400-e29b-41d4-a716-446655440000」のような形式になります。

Pythonの標準ライブラリ uuid モジュールを使えば、用途に応じた4種類のUUIDを簡単に生成できます。

目次

名前空間定数の一覧

UUIDバージョン3と5(名前ベース)を使用する際に指定する「名前空間(Namespace)」の定数は以下の通りです。

定数名意味・用途
uuid.NAMESPACE_DNSFQDN(完全修飾ドメイン名)を指定する場合
uuid.NAMESPACE_URLURLを指定する場合
uuid.NAMESPACE_OIDISO OID(オブジェクト識別子)を指定する場合
uuid.NAMESPACE_X500X.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 を使用します。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次