除了可接受的答案外,还有在某些情况下有用的第三种选择:
带有随机MAC的v1(“ v1mc”)
通过故意生成带有随机广播MAC地址的v1 UUID(v1规范允许),可以在v1和v4之间进行混合。生成的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对象;如果有人愿意,可以发布)
如果每秒的呼叫量很大,则有可能耗尽系统的随机性。您可以改用stdlib random
模块(它可能也会更快)。但请注意:攻击者只需几百个UUID即可确定RNG状态,从而部分预测未来的UUID。
import random
from uuid import uuid1
def uuid1mc_insecure():
return uuid1(random.getrandbits(48) | 0x010000000000)