Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

PythonでUUIDをつくる

uuidはそれぞれ衝突しないIDを実装者が自由なタイミングで生成できる仕組みです。
iOSアプリを開発してる人なんかだと、ベータ版ユーザさんからかき集める例の16進数文字列というと分かり易いかも?
一応、理論上は衝突し得ますが

仮に毎秒数億個以上のスピードでUUIDを作ったとしても,人の一生どころか宇宙が誕生してから現在に至るまでの年月(約137億年)作り続けても重複などまずありえないほど

UUID | 日経 xTECH(クロステック)

との事なので、まぁあまり気にしなくて良さそう。
バージョンは1,3,4,5とあり用途によって使い分けができます。

実際のところ

たとえば、SHA1を使ってUUIDを出すバージョン5だとこんな感じで動きます。

uuid.uuid5(uuid.NAMESPACE_DNS, 'shuzo_kino')
#>> UUID('6ba7b810-9dad-11d1-80b4-00c04fd430c8')
uuid.uuid5(uuid.NAMESPACE_DNS, 'shuzo_kino')
#>> UUID('c20f30ce-c4b5-5370-99f8-ea30a4d85eb8')

version4は乱数から生成するもので、デバイス固有情報は漂白されています。
base64と合わせる事でセッション記号として使ったりするみたいですね。

print(base64.b64encode(uuid.uuid4().bytes + uuid.uuid4().bytes))
#>> b'4ygcWrMbQZGjUu5+hvNPmB7azE3B2klprzmFxqFdA5c='
print(base64.b64encode(uuid.uuid4().bytes + uuid.uuid4().bytes))
#>> b'Akg9f5iKTP6iDFBvb1PX8i6f43XO1kCoiHDQXd5oxFU='

ちょっと面白い使い方として……端末のMACアドレスを調べる……なんて使い方も。
これはバージョン1の生成データがmacアドレスである事から来ています。

import re, uuid
print(':'.join(re.findall('..', '%012x' % uuid.getnode())))
#>> 6c:XX:YY:ZZ:81:12