我从文档中了解了两者之间的差异

https://docs.python.org/2/library/uuid.html

https://docs.python.org/3/library/uuid.html

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

uuid4()
生成随机UUID。

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

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

 

 

解决方案

 


 

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

 

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

 

uuid4()正如你所说,生成一个随机的UUID。碰撞的可能性确实非常小。足够小,你不应该担心它。问题是,一个坏的随机数生成器使它更容易发生冲突。

 

Bob Aman的这个出色的答案总结得很好。(我建议阅读整个答案。)

 

坦率地说,在没有恶意攻击者的单个应用程序空间中,即使在版本4 UUID上,即使你每秒生成相当多的UUID,地球上所有生命的灭绝也会在你发生碰撞之前很久就会发生。

 

import uuid

# make a UUID based on the host ID and current time
uuid.uuid1()
UUID('a8098c1a-f86e-11da-bd1a-00112444be1e')

# make a UUID using an MD5 hash of a namespace UUID and a name
uuid.uuid3(uuid.NAMESPACE_DNS, 'python.org')
UUID('6fa459ea-ee8a-3ca4-894e-db77e160355e')

# make a random UUID
uuid.uuid4()
UUID('16fd2706-8baf-433b-82eb-8c7fada847da')

# make a UUID using a SHA-1 hash of a namespace UUID and a name
uuid.uuid5(uuid.NAMESPACE_DNS, 'python.org')
UUID('886313e1-3b8a-5372-9b90-0c9aee199e5d')

# make a UUID from a string of hex digits (braces and hyphens ignored)
x = uuid.UUID('{00010203-0405-0607-0809-0a0b0c0d0e0f}')

# convert a UUID to a string of hex digits in standard form
str(x)
'00010203-0405-0607-0809-0a0b0c0d0e0f'

# get the raw 16 bytes of the UUID
x.bytes
b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f'

# make a UUID from a 16-byte string
uuid.UUID(bytes=x.bytes)
UUID('00010203-0405-0607-0809-0a0b0c0d0e0f')
posted on 2023-04-17 15:20  aha_baby  阅读(268)  评论(0编辑  收藏  举报