読者です 読者をやめる 読者になる 読者になる

Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

PythonでUUIDをつかう

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

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

Linuxキーワード - UUID:ITpro

との事なので、まぁあまり気にしなくて良さそう。
バージョンは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