使用哪个UUID版本?

时间:2013-12-03 03:01:11

标签: uuid

您应该使用哪个版本的UUID?我看到很多线程解释了每个版本的含义,但是我无法弄清楚什么是最适合的应用程序。

5 个答案:

答案 0 :(得分:318)

有两种不同的生成UUID的方法。

如果您只需要一个唯一的ID,则需要版本1或版本4.

  • 版本1:根据网卡MAC地址和计时器生成唯一ID。这些ID很容易预测(给定一个,我可以猜测另一个)并且可以追溯到您的网卡。不建议创建这些。

  • 版本4:这些是从随机(或伪随机)数字生成的。如果您只需要生成UUID,这可能就是您想要的。

如果您需要始终从给定名称生成相同的UUID,则需要版本3或版本5.

  • 版本3:这将从命名空间和名称的MD5哈希生成唯一ID。如果您需要向后兼容(使用另一个从名称生成UUID的系统),请使用此功能。

  • 版本5:这将从命名空间和名称的SHA-1哈希生成唯一ID。这是首选版本。

答案 1 :(得分:44)

如果您想要随机数,请使用随机数字库。如果你想要一个有效0.00的唯一标识符...这里有更多的0 ...碰撞的概率为001%,你应该使用UUIDv1。请参阅Nick的UUIDv3和v5的帖子。

UUIDv1不安全。它并不意味着。它意味着独特,不可猜测。 UUIDv1使用当前时间戳,加上一个机器标识符,加上一些随机的东西来制作一个永远不会再被该算法生成的数字。这适用于交易ID(即使每个人都在进行数百万次交易)。

老实说,我不明白为什么UUIDv4存在......从阅读RFC4122开始,看起来这个版本并没有消除碰撞的可能性。它只是一个随机数发生器。如果这是真的,那么世界上两台机器的机会很大,最终会创建相同的“UUID”v4(引用因为没有保证U.niversal U.niqueness的机制)。在那种情况下,我不认为该算法属于描述生成唯一值的方法的RFC。它属于关于生成随机性的RFC。对于一组随机数:

chance_of_collision = 1 - (set_size! / (set_size - tries)!) / (set_size ^ tries)

答案 2 :(得分:15)

这是一个非常普遍的问题。一个答案是:“这取决于您希望生成什么样的UUID”。但更好的是:“好吧,在我回答之前,你能否告诉我们为什么你需要编写自己的UUID生成算法,而不是调用大多数现代操作系统提供的UUID生成功能?”

这样做更容易,更安全,并且由于您可能不需要生成自己的,为什么还要编写实现代码呢?在这种情况下,无论您的O / S,编程语言或框架提供什么,答案都会变得有用。例如,在Windows中,有CoCreateGuidUuidCreate或者使用的众多框架中提供的各种包装器之一。在Linux中有uuid_generate

如果您出于某种原因,绝对需要自己创建,那么至少要有远离来生成v1和v2 UUID。让这些正确,这很棘手。相反,请粘贴到v3,v4或v5 UUID。

<强>更新: 在评论中,您提到您正在使用Python并链接到this。通过提供的界面,您可以选择最简单的选项,通过调用uuid.uuid4()生成v4 UUID(即从随机数据创建的UUID)。

如果你有一些数据需要(或可以)哈希来生成UUID,那么你可以使用v3(依赖于MD5)或v5(依赖于SHA1)。生成v3或v5 UUID很简单:首先选择要生成的UUID类型(您应该选择v5),然后选择适当的命名空间并使用您要用于生成UUID的数据调用该函数。例如,如果您要对网址进行哈希处理,则可以使用NAMESPACE_URL

uuid.uuid3(uuid.NAMESPACE_URL, 'https://ripple.com')

请注意,此UUID与同一网址的v5 UUID不同,后者生成如下:

uuid.uuid5(uuid.NAMESPACE_URL, 'https://ripple.com')

v3和v5 URL的一个不错的属性是它们应该在实现之间可以互操作。换句话说,如果两个不同的系统正在使用符合RFC4122的实现,那么如果所有其他事物都相同,它们将(或至少应该)都生成相同的UUID(即生成相同的版本UUID) ,具有相同的命名空间和相同的数据)。此属性在某些情况下非常有用(特别是在内容可寻址的存储方案中),但可能不适合您的特定情况。

答案 3 :(得分:0)

Postgres documentation描述了UUID之间的区别。其中几个:

V3:

  

uuid_generate_v3(namespace uuid, name text)-此函数使用指定的输入名称在给定的名称空间中生成版本3 UUID。

V4:

  

uuid_generate_v4-此函数生成版本4 UUID,该版本完全由随机数得出。

答案 4 :(得分:0)

由于尚未提及:如果您希望能够按创建时间对实体进行排序而无需单独的显式时间戳,则可以使用 uuidv1。虽然这不是 100% 精确,并且在许多情况下不是最好的方法(由于缺乏明确性),但它在某些情况下很方便,例如当您使用 Cassanda 数据库时。