pythonでUUIDを扱う
データベースのプライマリキーにしたかったので。 そして案の定、いつもググってる気がするので。
ライブラリは付属電池の中にある。すぐにつかえる。
>>> import uuid
生成はUUIDインスタンスを返す関数で行う。
利用可能なバージョンは、1、3、4、5。 1は必要ならばMACアドレスとクロックシーケンスの指定が可能。いずれもintを渡す。
3と5は何らかの識別子文字列とその種類(uuidモジュール内の「NAMESPACE_」が接頭辞の定数)を渡す必要あり。
ランダムな4を使えばいいかな。
# UUID v1 >>> uuid.uuid1(node=0) UUID('28dfb26c-d997-11e7-aa15-000000000000') # UUID v3/5 >>> uuid.uuid3(uuid.NAMESPACE_DNS, 'example.net') UUID('1f986141-bd0d-3417-8125-3033cca442fe') >>> uuid.uuid5(uuid.NAMESPACE_DNS, 'example.net') UUID('90d38b76-e7dd-5733-8575-0d06a98e8b70' # UUID v4 >>> uuid.uuid4() UUID('91655afb-8f2e-4b75-977a-7018034f128e')
データベースに保存するなど、文字列へのキャストが必要なら、str()で可能。
>>> str(uuid.uuid4()) '092856d8-869d-4c9d-a901-519a4bc39e31'
逆にデータベースに保存した文字列から元に戻すには、UUIDクラスのコンストラクタにUUIDの形式である文字列を渡せばできる。 へんてこな文字列を渡すとValueError例外が出る。
>>> uuid.UUID('092856d8-869d-4c9d-a901-519a4bc39e31') UUID('092856d8-869d-4c9d-a901-519a4bc39e31') >>> uuid.UUID('spamspamspamspamspamspamspamspamspam') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python3.5/uuid.py", line 140, in __init__ raise ValueError('badly formed hexadecimal UUID string') ValueError: badly formed hexadecimal UUID string >>> uuid.UUID('spamspam-spam-spam-spam-spamspamspam') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python3.5/uuid.py", line 141, in __init__ int = int_(hex, 16) ValueError: invalid literal for int() with base 16: 'spamspamspamspamspamspamspamspam'
UUIDインスタンス同士でも直接等価チェックできる。文字列や数値に変換しなくてもいい。
>>> uuid_spam = uuid.UUID('092856d8-869d-4c9d-a901-519a4bc39e31') >>> uuid_hum = uuid.UUID('092856d8-869d-4c9d-a901-519a4bc39e31') >>> uuid_egg = uuid.UUID('90d38b76-e7dd-5733-8575-0d06a98e8b70') >>> uuid_spam == uuid_hum True >>> uuid_spam == uuid_egg False