##はじめに
PythonでUUIDを生成する方法です。
本記事はPython3.8を使用しています。
uuidというモジュールを使ってUUIDを生成するのですが、
Python3では標準ライブラリとしてバンドルされているので、
importしてすぐに使用できます。
##UUIDとは
UUID(Universally Unique Identifier)とは、世界で同じ値を持つことがない一意な識別子です。
##バージョン1
uuid.uuid1(node=None, clock_seq=None)
バージョン1は、時刻とMACアドレスを利用したUUIDで、
uuid1はホストID、シーケンス番号、現在時刻からUUIDを生成します。
uuid.uuid1()
引数なしでも利用可能です。
nodeがなければuuid.getnode()で、ハードウェアアドレスを取得しそれが適用されます。
clock_seqは、シーケンス番号として使われ、
なければ14ビットのランダムなシーケンス番号が生成され適用されます。
uuid.getnode()
48 ビットの正の整数としてハードウェアアドレスを取得します。最初にこれを起動すると、別個のプログラムが立ち上がって非常に遅くなることがあります。もしハードウェアを取得する試みが全て失敗すると、ランダムな 48 ビットを、RFC 4122 で推奨されているように、マルチキャストビット (最初のオクテットの最下位ビット) を 1 に設定して使います。"ハードウェアアドレス" とはネットワークインターフェースの MAC アドレスを指します。複数のネットワークインターフェースを持つマシンの場合、全域管理されたMACアドレス (最初のオクテットの下位より2番目のビットが 設定されていない MACアドレス) が、他の個別管理アドレスよりも優先的に使用されます。この優先順序は保証されません。
コンピュータのネットワークアドレスを含むUUIDを生成するので注意が必要。
##バージョン3, バージョン5
uuid.uuid3(namespace, name)
uuid.uuid5(namespace, name)
バージョン3と5は、ドメイン名など何かしら一意な文字(バイト列)を用いたUUIDで、
uuid3はMD5ハッシュから、uuid5はSHA-1ハッシュからUUIDを生成します。
namespaceに名前空間識別子を指定して、それに沿った文字列を渡してUUIDを生成します。
namespaceでは以下を指定します。
uuid.NAMESPACE_DNS
name文字列に完全修飾ドメイン名を指定する。
uuid.NAMESPACE_URL
name文字列にURLを指定する。
uuid.NAMESPACE_OID
name文字列にISO OID(オブジェクト識別子)を指定する。
uuid.NAMESPACE_X500
name文字列にX.500 DNのDERまたはテキスト出力形式を指定する。
##バージョン4
uuid.uuid4()
バージョン4は乱数により生成されるUUIDで、
uuid4はOS固有の乱数でランダムなUUIDを生成します。
使用例
import uuid
print(uuid.uuid1())
print(uuid.uuid3(uuid.NAMESPACE_URL, 'www.google.com'))
print(uuid.uuid5(uuid.NAMESPACE_URL, 'www.google.com'))
print(uuid.uuid4())
print(type(uuid.uuid1()))
実行結果
57aa71b8-7ead-11ec-932c-acde48001122
d407cf76-ed73-3579-959e-78c80e8d4579
c74a196f-f19d-5ea9-bffd-a2742432fc9c
b9f9b678-bce8-49a1-bca3-dbbc32259abf
<class 'uuid.UUID'>
##まとめ
ドキュメントにも書いてある通りなのですが、単純にUUIDを生成したいのであればuuid4を利用すると良いです。
ちなみにuuid2はRFC 4122で指定されておらず、このモジュールではサポートされていないようです。
##参考
https://docs.python.org/ja/3/library/uuid.html