Pythonのuuid3()とuuid5()でハッシュIDを生成する方法
UUID(Universally Unique Identifier:汎用一意識別子)は、32ビットの16進数で表される識別子であり、特定の名前空間内での一意性を保証します。プログラムが生成したオブジェクトの追跡や、大規模な識別子が必要となるデータ処理など、Pythonでオブジェクトやデータを扱うさまざまな場面で活用できます。Pythonのuuidモジュールには、こうした識別子を生成するための関数が標準で用意されています。
本記事では、ハッシュ値を利用して決定的なUUIDを生成できる uuid3() と uuid5() の使い方を解説します。
構文と名前空間
uuid3(namespace, string) uuid3はMD5ハッシュ値を使用して識別子を生成します。 uuid5(namespace, string) uuid5はSHA-1ハッシュ値を使用して識別子を生成します。
namespace 引数には、UUIDの一意性の範囲を定める名前空間を指定します。主な定数は以下の通りです。
- NAMESPACE_DNS:名前文字列が完全修飾ドメイン名(FQDN)である場合に使用します。
- NAMESPACE_URL:名前文字列がURLである場合に使用します。
このほかにも NAMESPACE_OID(ISO OID)や NAMESPACE_X500(X.500識別名)といった名前空間が用意されています。
サンプルコード
次の例では、元となる文字列を指定し、それをもとに異なる名前空間・アルゴリズムでUUIDを生成しています。
import uuid
# 任意の文字列
str1 = "www.tutorialspoint.com"
str2 = "https://www.Tutorialspoint.com"
print("uuid3で生成したID:\n", uuid.uuid3(uuid.NAMESPACE_URL, str1))
print("uuid3で生成したID:\n", uuid.uuid3(uuid.NAMESPACE_DNS, str2))
print("uuid5で生成したID:\n", uuid.uuid5(uuid.NAMESPACE_URL, str1))
print("uuid5で生成したID:\n", uuid.uuid5(uuid.NAMESPACE_DNS, str2))上記のコードを実行すると、次のような結果が出力されます。
実行結果
uuid3で生成したID : e5051d13-d1a5-381a-bc21-5017b275a7f2 uuid3で生成したID : de365612-734a-38e3-abc4-6e3ffc7d61db uuid5で生成したID : a064f94e-5ff6-51e4-88e2-e2163a79abce uuid5で生成したID : b9761e0a-0ef3-5fd3-9ec4-86b6e073e61b
押さえておきたいポイント
- 決定的な生成:
uuid3()とuuid5()は、同じ名前空間と同じ文字列を渡せば、何度実行しても必ず同じUUIDが返されます。ランダム性を持つuuid4()とは異なり、入力から一意に決まるIDが必要なケースに適しています。 - uuid5の推奨:MD5を使用する
uuid3()に対し、SHA-1を使用するuuid5()の方が衝突耐性が高いため、特別な理由がない限りはuuid5()の使用が推奨されます。 - 用途の目安:ドメイン名やURLなど、既存の名前に紐づく安定した識別子を作りたい場合に特に有用です。
-
PythonでMD5ハッシュを生成する方法|hashlibモジュールの使い方を徹底解説
データセキュリティは、あらゆるIT企業にとって最重要課題の一つです。データを保護し、その完全性を検証するために、さまざまなハッシュ技術が活用されています。本記事では、Pythonを使ってMD5ハッシュを生成・エンコードする方法を、具体的なコード例とともにわかりやすく解説します。 ハッシュとは何か ハッシュとは、可変長のバイト列を入力として受け取り、それを固定長のバイト列へと変換する関数のことです。重要な特徴として、元のデータ(入力されたバイト列)を復元することが極めて困難である点が挙げられます。例えば、入力を x、ハッシュ関数を f とした場合、f(x) の計算は高速かつ簡単に行えますが、そこ
-
MacでPython 3にアップグレードして使いこなす方法
購入したばかりの新しいMacには、必要なソフトウェアの最新版がすべて入っていると思いがちですが、ユーザー向けアプリについては概ね正しくても、基盤となるフレームワークに関しては話が別です。安定版の最新リリースがPython 3.5であるにもかかわらず、新しいMacには今なおPython 2.7.10がプリインストールされています。バージョン間の差が大きく感じられるのはそのためです。ただし、新しいバージョンが必ずしも優れているとは限りません。Python 3はPython 2との後方互換性を持たず、多くの開発者は依然としてPython 2を使い続けているのです。 2to3を使うか、使わないか?