除了接受的答案之外,还有第三个选项在某些情况下可能有用:
带有随机 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 对象;如果有人愿意,可以发布)
在每秒调用量很大的情况下,这有可能耗尽系统随机性。您可以改用 stdlibrandom
模块(它可能也会更快)。但请注意:攻击者只需几百个 UUID 就可以确定 RNG 状态,从而部分预测未来的 UUID。
import random
from uuid import uuid1
def uuid1mc_insecure():
return uuid1(random.getrandbits(48) | 0x010000000000)