受け入れられた回答に加えて、場合によっては役立つ3番目のオプションがあります。
ランダムMACを使用したv1( "v1mc")
ランダムなブロードキャストMACアドレスを使用してv1UUIDを意図的に生成することにより、v1とv4のハイブリッドを作成できます(これはv1仕様で許可されています)。結果のv1UUIDは(通常のv1のように)時間に依存しますが、すべてのホスト固有の情報(v4のように)を欠いています。また、衝突耐性の点でv4にはるかに近いです。v1mc=60ビットの時間+61のランダムビット=121の一意のビット。v4=122ランダムビット。
私が最初にこれに遭遇したのは、Postgresのuuid_generate_v1mc()関数でした。それ以来、次のPythonに相当するものを使用しました。
from os import urandom
from uuid import uuid1
_int_from_bytes = int.from_bytes # py3 only
def uuid1mc():
# NOTE: The constant here is required by the UUIDv1 spec...
return uuid1(_int_from_bytes(urandom(6), "big") | 0x010000000000)
(注:UUIDオブジェクトを直接作成するより長い+より高速なバージョンがあります。必要に応じて投稿できます)
大量の呼び出し/秒の場合、これはシステムのランダム性を使い果たす可能性があります。代わりにstdlibモジュールを使用することもできます(おそらくより高速になります)。random
ただし、注意してください。攻撃者がRNGの状態を判断し、将来のUUIDを部分的に予測できるようになるまでには、数百のUUIDしか必要ありません。
import random
from uuid import uuid1
def uuid1mc_insecure():
return uuid1(random.getrandbits(48) | 0x010000000000)