2023-10-15 08:00:03

使用哪个UUID版本?

您应该使用哪个版本的UUID ?我看到很多帖子解释了每个版本需要什么,但我不知道什么最适合什么应用程序。


当前回答

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

其他回答

版本1:使用时间戳和单调计数器的uuid。 版本3:基于某些数据的MD5哈希的uuid。 版本4:带有随机数据的uuid。 版本5:基于某些数据的SHA1哈希的uuid。 版本6:使用时间戳和单调计数器的uuid。 版本7:使用Unix时间戳的uuid。 版本8:使用用户定义数据的uuid。

阅读Rust文档。

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

Postgres文档描述了uuid之间的差异。其中有几个:

V3:

uuid_generate_v3(命名空间uuid,名称文本)——该函数使用指定的输入名称在给定的命名空间中生成版本3的uuid。

V4:

uuid_generate_v4——这个函数生成一个版本4的UUID,它完全由随机数派生。

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

UUIDv1不安全。这不是命中注定的。这意味着它是唯一的,而不是不可猜测的。UUIDv1使用当前时间戳,加上一个机器标识符,再加上一些随机的东西来生成一个永远不会再由该算法生成的数字。这适用于事务ID(即使每个人都在处理数百万事务/秒)。

To be honest, I don't understand why UUIDv4 exists... from reading RFC4122, it looks like that version does NOT eliminate possibility of collisions. It is just a random number generator. If that is true, than you have a very GOOD chance of two machines in the world eventually creating the same "UUID"v4 (quotes because there isn't a mechanism for guaranteeing U.niversal U.niqueness). In that situation, I don't think that algorithm belongs in a RFC describing methods for generating unique values. It would belong in a RFC about generating randomness. For a set of random numbers:

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

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

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

Version 1: This generates a unique ID based on a network card MAC address and current time. If any of these things is sensitive in any way, don't use this. The advantage of this version is that, while looking at a list of UUIDs generated by machines you trust, you can easily know whether many UUIDs got generated by the same machine, or infer some time relationship between them. Version 4: These are generated from random (or pseudo-random) numbers. If you just need to generate a UUID, this is probably what you want. The advantage of this version is that when you're debugging and looking at a long list of information matched with UUIDs, it's quicker to spot matches.

如果需要从给定的名称生成可重复的uuid,则需要版本3或版本5。如果您正在与其他系统交互,则已经做出了这个选择,您应该检查它们使用的版本和名称空间。

版本3:从命名空间和名称的MD5散列生成唯一ID。如果您正在处理非常严格的资源要求(例如,非常繁忙的Arduino板),请使用此方法。 版本5:它从名称空间和名称的SHA-1散列生成唯一ID。这是更安全且通常推荐的版本。