サマリー
問題
Python 3.9.2 において、UUID バージョン1 を生成する関数 uuid.uuid1(node=None, clock_seq=None)
は、clock_seq
が与えられない場合はランダムに14ビットのシーケンス番号が選ばれる、と公式ドキュメントには書かれている。しかし、実際に複数回生成してみると、シーケンス番号が同一となる。
どうすればドキュメント通りに生成できるか。
解決方法
uuid.uuid1(node=uuid.getnode())
とすればドキュメント通りに振る舞う。
参考文献
- Python 3.9.2 ドキュメント > Python 標準ライブラリ > uuid: https://docs.python.org/ja/3/library/uuid.html#uuid.uuid1
- Wikipedia. UUID: https://ja.wikipedia.org/wiki/UUID
実験環境
- macOS Big Sur, バージョン 11.12.1
- Python 3.9.2:
anyenv
のpyenv
プラグインでインストール。
調査結果
ネットで検索した結果 (すみません URL 失念しました) によると、
-
node is None
の場合は (glibc か何かの?) システム関数が呼ばれる らしい。この場合、少なくとも一定の時間内の複数回生成では、ある決まったシーケンス番号が返ってくる。 -
node
に値が割り当てられている場合は Python による実装が呼ばれる。この場合は呼び出し毎にランダムなシーケンス番号が生成されているように見える。
node
を省略した場合のデフォルト値は uuid.getnode()
なので、uuid.uuid1(node=uuid.getnode())
とすればドキュメント通りに振る舞う。
以上