你应该使用哪个版本的UUID?我看到了很多线程解释每个版本包含的内容,但我很难确定什么适用于什么应用程序。
你应该使用哪个版本的UUID?我看到了很多线程解释每个版本包含的内容,但我很难确定什么适用于什么应用程序。
生成UUID有两种不同的方法。
如果您只需要一个唯一的ID,您需要版本1或版本4。
版本1:这将基于网络卡MAC地址和当前时间生成一个唯一ID。如果其中任何一项在任何方面都是敏感的,请勿使用此选项。该版本的优点在于,当查看由您信任的机器生成的UUID列表时,您可以轻松地知道许多UUID是否由同一台机器生成,或者推断它们之间的时间关系。
版本4:这些是从随机(或伪随机)数字生成的。如果您只需生成UUID,则可能需要使用此选项。该版本的优点在于,在调试并查看与UUID匹配的大量信息时,更容易快速发现匹配项。
如果您需要根据给定名称生成可重复UUID,则需要版本3或版本5。如果您正在与其他系统交互,则已经做出了此选择,您应该检查他们使用哪个版本和命名空间。
版本3:这将从命名空间和名称的MD5哈希中生成唯一ID。如果您正在处理非常严格的资源要求(例如非常繁忙的Arduino板),请使用此选项。
版本5:这将从命名空间和名称的SHA-1哈希中生成唯一ID。这是更安全且通常推荐的版本。
说实话,我不明白为什么UUIDv4存在...从阅读RFC4122来看,这个版本并没有消除碰撞的可能性。它只是一个随机数生成器。如果这是真的,那么世界上有两台机器最终创建相同的"UUID"v4(引号因为没有保证通用唯一性的机制),这种情况下,我认为该算法不应该出现在描述生成唯一值方法的RFC中,而应该出现在描述生成随机性的RFC中。对于一组随机数:
chance_of_collision = 1 - (set_size! / (set_size - tries)!) / (set_size ^ tries)
这是一个非常普遍的问题。一个答案是:“这取决于您想要生成什么类型的UUID”。但更好的答案是:“在回答之前,能告诉我们为什么您需要编码自己的UUID生成算法而不是调用大多数现代操作系统提供的UUID生成功能吗?”
这样做更容易、更安全,而且由于您可能不需要生成自己的UUID,那么何必费力实现呢?在这种情况下,答案就是使用您的操作系统、编程语言或框架提供的功能。例如,在Windows中,有CoCreateGuid或UuidCreate或来自众多使用的框架的各种包装器。在Linux中,有uuid_generate。
如果您因某种原因绝对需要自己生成,那么至少要有良好的常识,远离生成v1和v2 UUID。这很难做到正确。相反,应使用v3、v4或v5 UUID。
更新:
在评论中,您提到正在使用Python并链接到此文档。通过查看提供的接口,对于您来说,最简单的选项是通过调用uuid.uuid4()
生成v4 UUID(即由随机数据创建的UUID)。
如果您需要(或可以)从某些数据中生成UUID,则可以使用v3(依赖于MD5)或v5(依赖于SHA1)。生成v3或v5 UUID很简单:首先选择要生成的UUID类型(您应该选择v5),然后选择适当的命名空间并使用要用于生成UUID的数据调用函数。例如,如果要散列URL,则应使用NAMESPACE_URL
:
uuid.uuid3(uuid.NAMESPACE_URL, 'https://ripple.com')
请注意,使用相同URL生成的v5 UUID与此UUID将不同,如下所示:
uuid.uuid5(uuid.NAMESPACE_URL, 'https://ripple.com')
v3和v5 UUID的一个好处是它们应该在实现之间是可互操作的。换句话说,如果两个不同的系统正在使用符合RFC4122的实现,则如果所有其他内容相等(即生成相同版本UUID,具有相同的命名空间和相同的数据),它们将(或至少应该)生成相同的UUID。这个属性在某些情况下可能非常有用(特别是在内容寻址存储方案中),但在您的特定情况下可能不适用。
NAMESPACE_URL
是一个 UUID,通常等于 6ba7b811-9dad-11d1-80b4-00c04fd430c8
,遵循 RFC-4122 第30页的建议。 - Jamie Ridding请在Rust 文档中了解更多信息。
Postgres文档描述了UUID
之间的差异。其中有几个:
V3:
uuid_generate_v3(namespace uuid, name text)
- 此函数使用指定的输入名称在给定命名空间中生成版本3 UUID。
V4:
uuid_generate_v4
- 此函数生成一个版本4 UUID,完全基于随机数生成。
既然还没有提到:如果您想按创建时间对实体进行排序而无需单独的显式时间戳,则可以使用uuidv1
。虽然这不是100%准确且在许多情况下不是最佳选择(由于缺乏明确性),但在某些情况下非常方便,例如当您使用Cassanda数据库时。