受け入れられた回答に加えて、いくつかの場合に役立つ可能性がある3番目のオプションがあります。
ランダムMACを持つv1(「v1mc」)
ランダムなブロードキャストMACアドレスを使用してv1 UUIDを意図的に生成することにより、v1とv4のハイブリッドを作成できます(これはv1仕様で許可されています)。結果のv1 UUIDは(通常の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オブジェクトを直接作成する、より長いバージョンとより速いバージョンがあります。誰かが望めば投稿できます)
1秒あたりのコール数が多い場合、これはシステムのランダム性を使い果たす可能性があります。代わりにstdlib モジュールを使用することもできますrandom
(おそらくより高速になります)。ただし、注意が必要です。攻撃者がRNG状態を判断して、将来のUUIDを部分的に予測できるようになるまでには、数百のUUIDしかかかりません。
import random
from uuid import uuid1
def uuid1mc_insecure():
return uuid1(random.getrandbits(48) | 0x010000000000)