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

265 投票
6 回答
161165 浏览
提问于 2025-04-15 16:18

我了解这两者之间的区别,来自于文档

uuid1():
根据主机ID、序列号和当前时间生成一个UUID。

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

所以,uuid1是通过机器信息、序列号和时间来生成UUID的。那么使用这两种方法各有什么优缺点呢?

我知道uuid1()可能会有隐私问题,因为它是基于机器的信息生成的。我想知道在选择这两者时还有没有其他更细微的考虑。我现在使用uuid4(),因为它是完全随机的UUID。但我在想,是否应该使用uuid1来减少碰撞的风险。

基本上,我在寻找大家关于使用这两者的最佳实践建议。谢谢!

6 个回答

40

你可能会考虑使用 uuid1() 而不是 uuid4() 的一个情况是当UUID是在不同的机器上生成时,比如说当多个在线交易在几台机器上处理以提高效率的时候。

在这种情况下,由于伪随机数生成器初始化不当,可能会导致UUID重复的风险增加。而且,生成的UUID数量越多,重复ID的可能性也就越大。

使用 uuid1() 的另一个好处是,它会隐含地记录每个GUID最初是在哪台机器上生成的(这部分信息在UUID的“节点”部分)。这对于调试可能会有帮助。

45

我的团队在做数据库升级脚本的时候遇到了麻烦,我们在几分钟内生成了大约12万个UUID(唯一标识符)。结果出现了UUID冲突,导致了主键约束被违反。

我们已经升级了数百台服务器,但在我们的亚马逊EC2实例上,这个问题出现了好几次。我怀疑是时钟精度不够,后来换用UUID4就解决了这个问题。

309

uuid1() 这个函数可以保证不会产生重复的标识符(前提是你同时生成的数量不要太多)。如果你希望生成的 uuid 和计算机之间没有任何联系,那就不建议使用这个方法,因为它会用到计算机的 MAC 地址来确保每个标识符的唯一性。

如果你在不到 100 纳秒的时间内生成超过 214uuid1,是有可能出现重复的,但对于大多数情况来说,这并不是个问题。

uuid4() 生成的是随机的 UUID。发生重复的几率非常非常小,小到你根本不需要担心。不过,如果随机数生成器不好,就可能会增加重复的几率。

Bob Aman 的这篇精彩回答 总结得很好。(我建议你读一下完整的回答。)

坦白说,在一个没有恶意行为者的单一应用环境中,地球上所有生命的灭绝都会发生在你遇到重复之前,即使是使用版本 4 的 UUID,即使你每秒生成很多个 UUID。

撰写回答