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)

大家都在看

  • Windows 使用 keytool 导入证书到 jdk 密钥库

    确定 java 安装路径, 一般情况下存在于 C:\Program Files\Java\jdk_xxx,根据自身电脑安装情况而定。 管理员权限打开终端 cmd , 进入 C:\P…

    Java 2023年6月7日
    086
  • java学习之SpringMVC

    Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,本质上相当于 Servlet。 Spring MVC 是结构最清晰的 Servl…

    Java 2023年6月13日
    085
  • ===============Nginx笔记(全)==================

    基本概念: Nginx: Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶…

    Java 2023年6月9日
    0182
  • Java的jstat命令使用详解

    jstat命令简介 jstat(Java Virtual Machine Statistics Monitoring Tool)是JDK提供的一个可以监控Java虚拟机各种运行状态…

    Java 2023年6月7日
    0128
  • MyBatis的配置

    MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中, 现实情况下有多种理由需要这么做。例如,开发、测试和生产环境需要有不同的配置;或者想在具…

    Java 2023年5月30日
    096
  • AOP介绍

    java;gutter:true;/**作者:呆萌老师*☑csdn认证讲师*☑51cto高级讲师*☑腾讯课堂认证讲师*☑网易云课堂认证讲师*☑华为开发者学堂认证讲师*☑爱奇艺千人名…

    Java 2023年6月13日
    069
  • 彻底掌握Makefile(三)

    彻底掌握Makefile(三) 前言 在前面的文章彻底掌握Makefile(一)和彻底掌握Makefile(二)当中,我们简要的介绍了一些常见的makefile使用方法,在本篇文章…

    Java 2023年6月8日
    080
  • Effective Java 第三版——74. 文档化每个方法抛出的所有异常

    Tips书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code注意,书中的有些代码里方法是基于Java 9…

    Java 2023年5月29日
    084
  • 通过过滤器实现前后端分离的跨域问题

    跨域指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制。在做前后端分离项目的时候就需要解决此问题。 创建过滤器解决跨域问…

    Java 2023年6月14日
    083
  • Java线程池介绍

    线程池(英语:thread pool):一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免…

    Java 2023年6月6日
    092
  • 设计模式 — Decorator(装饰模式)

    装饰模式(Decorator) 在某些情况下,我们可能会”过度的使用继承来扩展对象的功能”,由于继承为类型引入静态特质,使得这种扩展方式缺乏灵活性;并且随着…

    Java 2023年6月16日
    089
  • MAC电脑安装openJdk

    一、安全brew软件 [1]安全命令地址:https://brew.sh/index_zh-cn /bin/bash -c "$(curl -fsSL https://r…

    Java 2023年5月30日
    073
  • 个人springboot配置项

    update user set u_name="lisi"​ 应用名称 spring.application.name=auction_java 应用服务 WE…

    Java 2023年6月7日
    089
  • JS从入门到入狱(bushi)

    涉及到的链接: W3school-JavaScript教程 JavaScript简介 文档对象模型 (DOM) JavaScript BOM(浏览器对象模型) JS面向对象之原型 …

    Java 2023年6月16日
    095
  • 【Feign】OpenFeign入门以及部分源码解析

    一、OpenFeign介绍 OpenFeign是⼀种声明式,模版化的HTTP客户端。使⽤OpenFeign进⾏远程调⽤时,开发者完全感知不到这是在进⾏远程调⽤,⽽是像在调⽤本地⽅法…

    Java 2023年6月8日
    073
  • SpringCloud 下

    Swagger-UI 接口化工具 微服务是面向服务的架构, 在整个微服务项目中, 服务数量众多, 而每个服务又包含一系列 RESTFUL 风格API(controller), 开发…

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