UUID 的 8 个版本以及何时使用它们

UUID 的 8 个版本以及何时使用它们

有哪些不同的版本?

通常,当我们有多个编号版本时,数字越大越新,并且被认为越好。相比之下,有 8 个 UUID 版本(v1 到 v8),它们各不相同,并且全部在标准中定义。

在这里,我将提供一些关于它们的高层次解释,并链接到 RFC ,以防您需要更多详细信息。

  • UUID 版本 1 (v1)由时间戳、单调计数器和 MAC 地址生成。
  • UUID 版本 2 (v2)保留用于没有已知详细信息的安全 ID。
  • UUID 版本 3 (v3)是根据您提供的某些数据的 MD5 哈希值生成的。 RFC 在候选数据中建议了 DNS 和 URL。
  • UUID 版本 4 (v4)是根据完全随机的数据生成的。这可能是大多数人对 UUID 的想法和遇到的情况
  • UUID 版本 5 (v5)是根据您提供的一些数据的 SHA1 哈希值生成的。与 v3 一样,RFC 建议使用 DNS 或 URL 作为候选。
  • UUID 版本 6 (v6)由时间戳、单调计数器和 MAC 地址生成。这些数据与版本 1 相同,但更改了顺序,以便对它们进行排序时将按创建时间排序。
  • UUID 版本 7 (v7)由时间戳和随机数据生成。
  • UUID 版本 8 (v8)完全是自定义的(除了所有版本都包含的必需版本/变体字段)。

什么时候应该使用它们?

有八个不同的版本,您应该使用哪个?有一些常见的用例决定了您应该使用哪个,其中一些已被其他用例取代。

您通常会在其中两个之间进行选择:v4 或 v7。也有一些场合选择v5或v8。

  • 当您只想要一个随机 ID 时 ,请使用 v4。这是一个很好的默认选择。
  • 如果您要在希望能够排序的上下文中使用 ID,请使用 v7。例如,如果您使用 UUID 作为数据库键,请考虑使用 v7。
  • 如果您在 UUID 中有自己想要的数据,则使用 v5 或 v8,但一般来说,您会知道是否需要它。

其他的呢?

  • 根据 RFC ,v7 在 v1 和 v6 的基础上进行了改进,如果可能的话,应该使用 v7。所以你通常不需要 v1 或 v6。如果您确实想要其中之一,可以使用 v6。
  • v2 保留用于未指定的安全事务。如果您正在使用这些,您可能无法告诉我或其他任何人,并且您可能不会阅读这篇文章来了解有关它们的更多信息。
  • v3 被 v5 取代,后者使用更强的哈希值。您可能知道是否需要它。

UUIDv7 的优点:

  • 时间可排序性:如上所述,UUIDv7 值是可时间排序的,这意味着您可以根据生成时间以升序对它们进行排序。这使得基于时间的查询更加高效和直观。
  • 精确时间戳 :从之前的草案开始,UUIDv7 的粒度高达 50 纳秒(但在编写时默认为 1 毫秒,请参阅RFC4122 草案),UUIDv7 提供出色的精度。当与随机性相结合时,这基本上保证了碰撞(即使在全球分布式系统之间!)是不可能的。
  • 全球唯一性:与其他 UUID 一样,UUIDv7 确保全球唯一性。这意味着您可以跨不同系统或节点独立生成 ID,并且它们不会发生冲突。

为什么 UUIDv7 更适合数据库:

  • 自然排序:传统数据库通常需要额外的时间戳列来根据创建时间对记录进行排序。借助 UUIDv7,您可以使用 UUID 本身实现这种排序,从而无需额外的列。
  • 优化索引:由于 UUIDv7 是可时间排序的,数据库索引机制可以更好地优化存储和检索过程,从而加快查询时间,尤其是基于时间的查询。
  • 并发和分布:在分布式系统中,生成唯一的、连续的 ID 可能是一个挑战。 UUIDv7 可以跨多个节点同时生成,没有冲突的风险,使其适合分布式架构。
  • 减少开销:与 UUIDv1 不同,UUIDv1 可以公开生成 UUID 的计算机的 MAC 地址(引发隐私问题),UUIDv7 没有这个缺点,减少了模糊或匿名化此数据的开销。
  • 灵活性:支持二进制存储的数据库可以有效地存储UUIDv7,并且如果需要,可以轻松地将它们编码为其他格式,例如字符串。

参考文章:

原文地址

# UUIDv7:现代数据库的时间可排序标识符

相关推荐
隐语SecretFlow1 小时前
隐语SecreFlow SCQL 1.0.0b1 发布:更完善的 SQL 支持与更高效的隐私查询引擎
数据库·sql
ttghgfhhjxkl1 小时前
文档搜索引擎搜索模块的索引更新策略:实时增量与全量重建设计
数据库·搜索引擎
老华带你飞1 小时前
机器人信息|基于Springboot的机器人门户展示系统设计与实现(源码+数据库+文档)
java·数据库·spring boot·机器人·论文·毕设·机器人门户展示系统
StarRocks_labs1 小时前
StarRocks 在 Cisco Webex 的探索与实践
数据库·starrocks·json·存算分离·olap 技术栈
notion20251 小时前
Adobe Lightroom Classic下载与安装教程(附安装包) 2025最新版详细图文安装教程
java·数据库·其他·adobe
unicrom_深圳市由你创科技2 小时前
用 CTE 重构嵌套子查询:让复杂报表 SQL 可读性提升 80%
mysql·重构
楚枫默寒2 小时前
mongodb备份脚本(单机+副本集)
数据库
小蒜学长3 小时前
springboot酒店客房管理系统设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端
准时准点睡觉4 小时前
window安装MYSQL5.5出错:a windows service with the name MYSQL alreadyexists....
数据库·windows·mysql
无敌最俊朗@4 小时前
SQlite:外键约束
数据库·oracle