UUID v7 一文详解

简介: UUID v7是RFC 9562定义的新型有序UUID,结合时间戳与随机数,兼具全局唯一性、时间有序性和隐私安全,适用于数据库主键与分布式系统,显著提升索引性能与系统效率。

UUID v7

UUID作为通用唯一识别码,其版本7(v7)是RFC 9562中定义的一种新型基于时间戳的有序UUID。旨在解决传统UUID(如完全随机的v4)在数据库索引和分布式系统中因无序导致的性能问题,同时避免了早期版本(如v1)可能泄露MAC地址的隐私顾虑。

核心特性

UUID v7 的核心特性可以从以下几个维度来理解

特性维度 UUID v7 的具体实现
核心原理 将 Unix 时间戳(毫秒精度) 作为高位,后接随机位和可选的计数器。
有序性 时间有序。生成的UUID值会随时间单调递增,非常适合作为数据库索引。
唯一性 在同一时间戳内,通过随机数或计数器保证唯一性
隐私安全 不包含MAC地址等硬件信息,避免了v1版本可能带来的隐私泄露问题。


技术结构

UUID v7 的技术结构介绍,我们也简单了解一下。UUID v7 是一个128位的数字,其结构设计确保了时间的可排序性。

  • 48位时间戳:高位部分是一个自Unix纪元(1970-01-01 00:00:00 UTC)起的毫秒级精度的时间戳
  • 版本位(4位):固定为0111,标识此为v7版本
  • 随机数与计数器:时间戳之后是随机数部分,并且可以包含一个计数器,用于在同一毫秒内生成多个UUID时保证其唯一性

UUID v7 与常用UUID版本的简单对比如下:


版本 原理 主要特点 典型使用场景
v1 时间戳 + MAC地址 可能泄露隐私,部分时间有序 传统系统
v4 完全随机 完全随机无序,生成简单 通用场景,对排序无要求的Web应用
v7 基于时间戳 时间有序,不泄露隐私 数据库主键,分布式系统,日志


核心优势

UUID v7 的设计带来了一些显著的优势:

  • 提升数据库性能:由于UUID v7具有时间有序性,当它作为数据库主键时,新插入的数据行通常会位于索引的末尾。这可以显著减少索引碎片,从而提升写入和查询效率。
  • 增强分布式系统效率:在分布式系统中,v7能够在不依赖中央协调机构的情况下生成全局唯一且大致有序的标识符,非常适合用于日志系统、消息队列和大规模事务处理。
  • 更好的隐私保护:与v1不同,v7不包含设备的MAC地址,消除了潜在的信息泄露风险。


注意事项

UUID v7有很多优点,但在采用前也需要了解以下几点:

  • 标准状态:UUID v7的规范已正式发布在RFC 9562中。UUID v7规范曾处于草案阶段,不同库的实现可能跟进最新标准,使用时请关注库的版本和兼容性。
  • 时间精度:标准精度为毫秒级。如果在同一毫秒内需要生成大量ID,需要依赖其内部的随机位或计数器来保证唯一性
  • 时间同步:在分布式部署中,需要确保所有生成UUID v7的机器保持时间同步,以保证其全局有序性。


在Java使用UUID v7


在Java中生成UUID v7,目前官方的 java.util.UUID 类尚未直接支持,但我们可以通过一些第三方库来实现。我们可以使用第三方库 uuid-creator 来实现。

引入依赖

在Maven 配置文件中添加下面的依赖

# https://github.com/f4b6a3/uuid-creator
<dependency>
  <groupId>com.github.f4b6a3</groupId>
  <artifactId>uuid-creator</artifactId>
  <version>6.1.1</version>
</dependency>

目前 uuid-creator 支持多个版本的依赖

image.png


详细介绍

关于 uuid-creator  当前已经实现的子类型列表主要包括以下:

  • UUID Version 1: the Gregorian time-based UUID specified in RFC 9562;
  • UUID Version 2: the DCE Security version, with embedded POSIX UIDs, specified in DCE 1.1;
  • UUID Version 3: the name-based version that uses MD5 hashing specified in RFC 9562;
  • UUID Version 4: The randomly or pseudorandomly generated version specified in RFC 9562;
  • UUID Version 5: the name-based version that uses SHA-1 hashing specified in RFC 9562;
  • UUID Version 6: the reordered Gregorian time-based UUID specified in RFC 9562;
  • UUID Version 7: the Unix Epoch time-based UUID specified in RFC 9562.

所有UUID子类型都可以从facade UuidCreator创建。facade的目标是将库的大部分功能放在一个地方,这样我们就不必担心库的内部。我们只需要决定应用程序需要哪个UUID子类型,并调用相应的生成方法。

Java 调用

下面我们将通过一个示例来展示如何通过 第三方库 uuid-creator  来获取 UUID 多个版本的唯一识别码

public static void main(String[] args) throws Exception {
        //Create a UUIDv1
        UUID uuid1 = UuidCreator.getTimeBased();
        System.out.println("Create a UUIDv1:"+uuid1);
        //Create a UUIDv2
        UUID uuid2 = UuidCreator.getDceSecurity(UuidLocalDomain.LOCAL_DOMAIN_PERSON, 1234);
        System.out.println("Create a UUIDv2:"+uuid2);
        //Create a UUIDv3
        UUID uuid3 = UuidCreator.getNameBasedMd5(UuidNamespace.NAMESPACE_URL, "https://github.com/");
        System.out.println("Create a UUIDv3:"+uuid3);
        //Create a UUIDv4
        UUID uuid4 = UuidCreator.getRandomBased();
        System.out.println("Create a UUIDv4:"+uuid4);
        //Create a UUIDv5
        UUID uuid5 = UuidCreator.getNameBasedSha1(UuidNamespace.NAMESPACE_URL, "https://github.com/");
        System.out.println("Create a UUIDv5:"+uuid5);
        //Create a UUIDv6
        UUID uuid6 = UuidCreator.getTimeOrdered();
        System.out.println("Create a UUIDv6:"+uuid6);
        //Create a UUIDv7
        UUID uuid7 = UuidCreator.getTimeOrderedEpoch();
        System.out.println("Create a UUIDv7:"+uuid7);
    }

执行main 方法我们可以看到获取到的不同版本的UUID

Create a UUIDv1:5807fb0a-b9e2-11f0-b2ec-49569973b564
Create a UUIDv2:000004d2-b9e2-21f0-8100-713f1ddf6795
Create a UUIDv3:295df05a-2c43-337c-b6b8-4b84826e4a94
Create a UUIDv4:31f9bb81-2b4b-45bc-bcc5-071625cb67c6
Create a UUIDv5:39983165-606c-5d83-abfa-b97af8b1ae8d
Create a UUIDv6:1f0b9e25-809c-6c95-861b-9de571a09c0a
Create a UUIDv7:019a5184-6aaa-7204-8bc4-9238b69d3c0b

image.png

写在最后

UUID v7 通过巧妙地将时间戳融入标识符的结构,成功地解决了传统随机UUID(v4)导致数据库索引性能下降的问题,同时避免了早期时间戳版本(v1)的隐私缺陷。如果你的项目,尤其是分布式系统或高负载数据库,正受困于无序主键带来的性能困扰,那么UUID v7无疑是一个值得考虑和尝试的优秀解决方案。

相关文章
|
22天前
|
SQL 安全 Java
Java编程技巧:<where>和<if>标签的组合使用示例
总之,通过合理运用MyBatis的 <where>和 <if>标签,我们可以构建出灵活而且安全的动态SQL语句。这不仅提升了代码的灵活性和可读性,还能有效地预防SQL注入等安全问题。上面给出的示例代码可作为标准模板,在实际开发过程中根据实际业务需求进行调整和扩展。
104 21
|
25天前
|
安全 Java API
超越基础:每个Java开发者都应了解的三个现代特性
超越基础:每个Java开发者都应了解的三个现代特性
225 118
|
24天前
|
机器学习/深度学习 弹性计算 网络协议
阿里云服务器ECS c9i实例收费价格:2核4G、4核8G和8核16G优惠配置整理
阿里云ECS计算型c9i实例,2核4G、4核8G、8核16G享优惠价,搭载Intel Xeon处理器,主频3.2GHz,适用于Web服务、机器学习等场景,ESSD云盘,网络性能强劲,限时活动价格低至181.73元/月。
215 95
|
人工智能 Java 测试技术
代码采纳率如何提升至50%?AI 自动编写单元测试实践总结
借助Aone Copilot Agent,通过标准化Prompt指导AI生成单元测试代码,实现50%代码采纳率,显著提升测试效率与质量,推动团队智能化研发转型。
236 21
|
22天前
|
缓存 Java 数据库
Java内存缓存利器: Caffeine详细介绍
的文档支持。无论你是需要一个简单快速的内存缓冲区还是需要一个复杂可配置、支持各种驱逐策略和刷新策略等高级特性的内部数据结构,Caffeine都能够满足你的需求。
187 11
|
14天前
|
存储 缓存 Java
重构一个类,JVM竟省下2.9G内存?
通过重构核心类,将 `HashMap<Long, HashSet<String>>` 优化为 `Long2ObjectOpenHashMap<int[]>`,结合数据分布特征与紧凑存储,JVM 堆内存从 3.13GB 降至 211MB,降幅达 94%,验证了高效数据结构在海量场景下的巨大价值。
182 24
重构一个类,JVM竟省下2.9G内存?
|
24天前
|
数据采集 人工智能 缓存
构建AI智能体:十一、语义分析Gensim — 从文本处理到语义理解的奇妙之旅
Gensim是Python中强大的自然语言处理库,擅长从大量中文文本中自动提取主题、生成词向量并计算文档相似度。它支持LDA、Word2Vec等模型,结合jieba分词可有效实现文本预处理、主题建模与语义分析,适用于新闻分类、信息检索等任务,高效且易于扩展。
224 17
|
3天前
|
SQL 关系型数据库 MySQL
MySQL从入门到精通:系统性学习路径
“MySQL从入门到精通”系统梳理了从基础到高阶的完整学习路径,涵盖安装配置、SQL语法、数据库设计、事务锁机制、性能优化、主从复制及分库分表等核心内容,结合实战任务帮助开发者由浅入深掌握MySQL,助力成为数据库高手。
69 13
|
5天前
|
消息中间件 Java 调度
深入探讨进程、线程和协程之间的区别和联系
本文深入解析进程、线程与协程的核心区别与联系,涵盖资源分配、调度机制、通信方式及性能对比。结合代码示例与实际场景,阐明三者在高并发系统中的协同应用,助你掌握现代并发编程设计精髓。(239字)
71 11
|
22天前
|
数据可视化 搜索推荐 大数据
2026版基于python大数据的旅游可视化及推荐系统
本研究聚焦基于Python大数据的旅游可视化与推荐系统,利用Python在数据处理、分析和可视化方面的优势,结合Django框架与MySQL数据库,构建高效、个性化的旅游推荐平台。通过爬取多源旅游数据,运用机器学习算法挖掘用户偏好,实现精准推荐;借助Matplotlib、Seaborn等工具进行数据可视化,直观展示景点分布、客流趋势等信息。系统不仅提升游客决策效率与体验,也助力旅游企业优化产品设计与营销策略,推动行业数字化转型与智能化发展。