ニシキヘビってかわいいよね、実際みたことないけど。

無職がいよかん国でプログラミングとかの備忘録を書いてます。 一日一食たまごかけごはん。

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