Java UUID的底层原理

UUID的几个核心特定:

全局时空唯一性
固定长度128比特,也就是16字节(1 byte = 8 bit)
分配速率极高,单机每秒可以生成超过1000万个UUID(实际上更高)

UUID是Universally Unique IDentifier的缩写,翻译为通用唯一标识符或者全局唯一标识符。UUID的长度为128比特,可以保证在空间和时间上的唯一性。

UUID本质是一个128比特的数字,这是一个位长巨大的数值,理论上来说,UUID的总数量为2^128个。这个数字大概可以这样估算:如果每纳秒产生1兆个不相同的UUID,需要花费超过100亿年才会用完所有的UUID。

UUID的变体与版本

UUID标准和算法定义的时候,为了考虑历史兼容性和未来的扩展,提供了多种变体和版本。接下来的变体和版本描述来源于维基百科中的Versions章节和RFC 4122中的Variant章节。

目前已知的变体如下:

变体0xx:Reserved, NCS backward compatibility,为向后兼容做预留的变体
变体10x:The IETF aka Leach-Salz variant (used by this class),称为Leach–Salz UUID或者IETF UUID,JDK中UUID目前正在使用的变体
变体110:Reserved, Microsoft Corporation backward compatibility,微软早期GUID预留变体
变体111:Reserved for future definition,将来扩展预留,目前还没被使用的变体

目前已知的版本如下:

0:空UUID(特殊版本0),用00000000-0000-0000-0000-000000000000表示,也就是所有的比特都是0
1:date-time and MAC address(版本1):基于时间和MAC地址的版本,通过计算当前时间戳、随机数和机器MAC地址得到。由于有MAC地址,这个可以保证其在全球的唯一性。但是使用了MAC地址,就会有MAC地址暴露问题。若是局域网,可以用IP地址代替
2:date-time and MAC address, DCE security version(版本2):分布式计算环境安全的UUID,算法和版本1基本一致,但会把时间戳的前4位置换为POSIX的UID或GID
3:namespace name-based MD5(版本3):通过计算名字和命名空间的MD5散列值得到。这个版本的UUID保证了:相同命名空间中不同名字生成的UUID的唯一性;不同命名空间中的UUID的唯一性;相同命名空间中相同名字的UUID重复生成是相同的
4:random(版本4):根据随机数,或者伪随机数生成UUID。这种UUID产生重复的概率是可以计算出来的,还有一个特点就是预留了6比特存放变体和版本属性,所以随机生成的位一共有122个,总量为2^122,比其他变体的总量要偏少
5:namespace name-based SHA-1(版本5):和版本3类似,散列算法换成了SHA-1

其中, JDK中应用的变体是Leach-Salz,提供了namespace name-based MD5(版本3)和random(版本4)两个版本的UUID生成实现

UUID的格式

UUID串是有格式要求的,通常是36个字符(32个字符加上4个连字符):格式为8-4-4-4-12,其中有效部分未32个字符。被连字符连起来的各部分有各自的含义,如时间戳、版本号等。

详情见前面的参考文章。

Original: https://www.cnblogs.com/z-sm/p/14653484.html
Author: March On
Title: Java UUID的底层原理

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/537421/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • SpringSecurity 新版2.7以上 快速入门

    SpringSecurity 快速入门 1、导入依赖 org.springframework.boot spring-boot-starter-security 2、测试三种权限 …

    Java 2023年6月16日
    063
  • 集合总结

    2.Collection集合 相同点 都是容器,可以存储多个数据 不同点 数组的长度是不可变的,集合的长度是可变的 数组可以存基本数据类型和引用数据类型 集合只能存引用数据类型,如…

    Java 2023年6月14日
    071
  • STM32网页云平台控制继电器采集温湿度显示智能配网8266wifi mqtt

    STM32 MQTT 网页云平台显示温湿度,控制继电器开关 Java开发框架 JSP+ Servlet + Mysql 数据库 采集温湿度数据,图表显示,并将温湿度数据存储到Mys…

    Java 2023年5月30日
    083
  • java读取pdf文件内容

    使用JAVA从PDF中获取文字信息,目前只能读取文字型PDF。图片型PDF尚在研究1.导入Maven依赖 <dependency> <groupid>org…

    Java 2023年6月6日
    078
  • 【软件构造】Java中的接口Interface

    【软件构造】Java中的接口Interface 1.前言 在Lab2中,要求通过Graph接口达到不同种类的实现目标,实验过程中也多次用到了java接口这一概念,编程时涉及了很多需…

    Java 2023年6月5日
    078
  • JWT详解与基本使用(保姆教程)

    前言: 最近准备写一篇关于security前后端分离场景下的认证与授权文章,里面使用到了jwt,所以就写了一篇jwt的文章,作为开头小菜😋 概述 讲jwt之前,先讲一下什么是tok…

    Java 2023年6月15日
    077
  • 线程池续:你必须要知道的线程池submit()实现原理之FutureTask!

    前言 上一篇内容写了 Java中线程池的实现原理及源码分析,说好的是实实在在的大满足,想通过一篇文章让大家对线程池有个透彻的了解,但是文章写完总觉得还缺点什么? 上篇文章只提到线程…

    Java 2023年5月30日
    065
  • Sentinel vs Hystrix 限流对比,到底怎么选?

    Sentinel 是阿里中间件团队开源的,面向分布式服务架构的轻量级高可用流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助用户保护服务的稳定性。…

    Java 2023年5月29日
    072
  • List实体中不同字段值的转换

    //将sql查询出的List Original: https://www.cnblogs.com/gjths/p/14179140.htmlAuthor: ExpectoPatro…

    Java 2023年6月13日
    053
  • java BigDecimal解决浮点数的精度丢失和大数计算问题

    抛出浮点数问题: 先考个题,输入什么? System.out.println(0.1 + 0.2); 答案: 0.30000000000000004 在我们日常数学计算中,0.1+…

    Java 2023年6月16日
    0100
  • 20年5月面试汇总

    redis: 数据结构 redis的五种基本数据结构: string、hash、set、zset、list、HyperLogLog…. 补充:BloomFilter等 …

    Java 2023年6月8日
    068
  • Nginx支持Socket转发过程详解

    序言 一网友在群中问,nginx支持socket转发吗? 实话说,我没做过socket转发,但是我知道socket跟http一样都是通过tcp或者udp通信的,我猜测啦一下ngin…

    Java 2023年5月30日
    0122
  • 【年度钻石】Linux云计算+运维(1)《博学谷》黑马

    运维概述与Linux系统安装 【年度钻石】Linux云计算+运维(1)《博学谷》黑马 目标 1、了解运维的基本概念2、了解企业的运行模式3、了解操作系统发展史以及作用4、掌握虚拟机…

    Java 2023年6月7日
    078
  • 数据库学习记录(二)

    1.count(*)和count(具体的某个字段),他们有什么区别? count(*):不是统计某个字段中数据的个数,而是统计总记录条数。(和某个字段无关) count(comm)…

    Java 2023年6月7日
    053
  • Java避坑宝典《Java业务开发常见错误100例》上线了

    写这个专栏的缘起 之前我写过一篇博客:《朱晔的互联网架构实践心得S2E2:写业务代码最容易掉的10种坑》,引起的关注还是挺多的。后来和极客时间的编辑一拍即合决定以这个为题写一个专栏…

    Java 2023年5月29日
    078
  • 008-博学谷-年度钻石C++/C-Unix/Linux(7)

    /bin指令 功能说明 范例 bash GNU Bouren-Again Shell bash shell_script cat 观看一般文本文件 cat file.txt chg…

    Java 2023年6月7日
    064
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球