在python中,我应该何时使用uuid.uuid1()与uuid.uuid4()?

2024-05-13 01:20:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我从docs.中了解到两者的区别

uuid1()
从主机ID、序列号和当前时间生成UUID

uuid4()
生成一个随机的UUID。

因此uuid1使用机器/序列/时间信息来生成UUID。使用它们的利弊是什么?

我知道uuid1()可能有隐私问题,因为它是基于机器信息的。我想知道在选择一个或另一个的时候是否有更微妙的东西。我现在只使用uuid4(),因为它是完全随机的UUID。但我想知道我是否应该使用uuid1来减少碰撞的风险。

基本上,我在寻找人们的最佳实践使用技巧。谢谢!


Tags: 机器信息iddocs技巧uuid时间序列
3条回答

一个可以考虑uuid1()而不是uuid4()的例子是,当uuid在单独的机器上生成时,例如,当多个联机事务在多台机器上处理以进行缩放时。

在这种情况下,例如,由于伪随机数生成器的初始化方式选择不当而产生冲突的风险,以及产生的uuid的潜在较高数量使得更可能创建重复id。

uuid1()的另一个兴趣在于,在这种情况下,最初生成每个GUID的机器是隐式记录的(在UUID的“node”部分)。这个和时间信息,如果只对调试有用的话。

uuid1()保证不会产生任何冲突(假设您不会同时创建太多冲突)。如果在uuid和计算机之间没有连接是很重要的,我就不会使用它,因为mac地址被用来使它在计算机之间是唯一的。

您可以通过在不到100ns的时间内创建超过214uuid1来创建副本,但这对于大多数用例来说不是问题。

uuid4()如您所说,生成一个随机UUID。碰撞的可能性真的,真的,真的很小。足够小,你不必担心。问题是,坏的随机数生成器使它更有可能发生冲突。

This excellent answer by Bob Aman总结得很好。(我建议阅读完整的答案。)

Frankly, in a single application space without malicious actors, the extinction of all life on earth will occur long before you have a collision, even on a version 4 UUID, even if you're generating quite a few UUIDs per second.

我的团队在使用UUID1进行数据库升级脚本时遇到了问题,我们在几分钟内生成了约120k个uuid。UUID冲突导致违反主键约束。

我们已经升级了100台服务器,但是在我们的Amazon EC2实例中,我们遇到过几次这个问题。我怀疑时钟分辨率差,切换到UUID4解决了这个问题。

相关问题 更多 >