代码之家  ›  专栏  ›  技术社区  ›  rocketmonkeys

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

  •  186
  • rocketmonkeys  · 技术社区  · 16 年前

    docs.

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

    uuid4()
    生成一个随机UUID。

    uuid1 使用机器/序列/时间信息生成UUID。使用每种方法的优缺点是什么?

    我知道 可能会有隐私问题,因为它基于机器信息。我不知道在选择一个或另一个时是否还有更微妙的地方。我只是用 现在,因为它是一个完全随机的UUID。但我想知道我是否应该使用 uuid1

    基本上,我在寻找人们关于使用其中一种方法与使用另一种方法的最佳实践的建议。谢谢

    6 回复  |  直到 12 年前
        1
  •  275
  •   Community Mohan Dere    9 年前

    uuid1() 保证不会产生任何碰撞(假设您不会同时创建太多碰撞)。我不会用它,如果它是重要的,有没有之间的联系 uuid

    可以通过创建两个以上的副本来创建副本 14 uuid1在不到100ns的时间内完成,但这对于大多数用例来说都不是问题。

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

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

    坦率地说,在单个应用程序空间中 如果没有恶意的参与者,那么 发生在你有一个 冲突,即使在版本4 UUID上, 即使你产生了很多 UUIDs/秒。

        2
  •  34
  •   user JaredPar    13 年前

    你可以考虑的一个例子 uuid1() 而不是 uuid4() 是 当UUID在单独的机器上生产时

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

    另一个兴趣 uuid1() ,在这种情况下,初始生成每个GUID的计算机被隐式记录(在UUID的“节点”部分)。此信息和时间信息可能有助于调试。

        3
  •  30
  •   Mattias Lagergren    10 年前

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

    我们已经升级了100台服务器,但在我们的AmazonEC2实例上,我们曾多次遇到这个问题。我怀疑较差的时钟分辨率和切换到UUID4解决了这一问题。

        4
  •  6
  •   Guillaume    12 年前

    使用时需要注意的一件事 uuid1 ,如果您使用默认呼叫(不提供 clock_seq

        5
  •  4
  •   c z    9 年前

    也许没有提到的是地方性。

    MAC地址或基于时间的排序(UUID1)可以提高数据库性能,因为与随机分布的数字(UUID4)相比,将数字更紧密地排序所需的工作更少(请参阅 here

    第二个相关问题是,即使源数据丢失或未显式存储,使用UUID1在调试中也很有用(这显然与OP提到的隐私问题相冲突)。

        6
  •  2
  •   Eli Collins    9 年前

    具有随机MAC的v1(“v1mc”)

    我遇到的第一个问题是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

    import random
    from uuid import uuid1
    
    def uuid1mc_insecure():
        return uuid1(random.getrandbits(48) | 0x010000000000)