我从文件中了解到两者之间的差异。
uuid1 ():
根据主机ID、序列号和当前时间生成UUID
uuid4 ():
生成一个随机UUID。
因此uuid1使用机器/序列/时间信息来生成UUID。使用它们的优缺点是什么?
我知道uuid1()可能存在隐私问题,因为它基于机器信息。我想知道在选择一个或另一个时是否有更微妙的地方。我现在只使用uuid4(),因为它是一个完全随机的UUID。但是我想知道是否应该使用uuid1来降低碰撞的风险。
基本上,我在寻找人们关于使用其中一种与另一种的最佳实践的建议。谢谢!
除了公认的答案之外,在某些情况下,还有第三种选择可能有用:
v1与随机MAC ("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随机模块(它可能也会更快)。但是要注意:攻击者只需要几百个uuid就可以确定RNG状态,从而部分预测未来的uuid。
import random
from uuid import uuid1
def uuid1mc_insecure():
return uuid1(random.getrandbits(48) | 0x010000000000)