UUID使用

news2024/11/19 20:45:22

1.UUID是什么?

UUID 是指(Universally Unique Identifier)通用唯一识别码,128位。RFC 4122描述了具体的规范实现。

2.UUID解决问题?

分库分表后自增Id重复问题。

3.UUID作用?

UUID 的目的是让分布式系统中的所有元素都能有唯一的识别信息。

4.UUID定义

UUID使用16进制表示,共有36个字符(32个字母数字+4个链接符“-”)组成,格式为8-4-4-4-12;是128位。
是由一组32位数的16进制数字所构成,故UUID理论上的总数为16^32 ;

格式:
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
 
示例:
6d25a684-9558-11e9-aa94-efccd7a0659b

格式中M和N的含义:
数字 M的四位表示 UUID 版本,当前规范有5个版本,M可选值为1, 2, 3, 4, 5 ;
数字 N的一至四个最高有效位表示 UUID 变体( variant ),有固定的两位10xx因此只可能取值8, 9, a, b。

UUID的五个版本

  • version 1, date-time & MAC address
  • version 2, date-time & group/user id
  • version 3, MD5 hash & namespace
  • version 4, pseudo-random number
  • version 5, SHA-1 hash & namespace

故UUID每个版本不是根据精度区分的,Version5并不会比Version1精度高,在精度上,大家都能保证唯一性,重复的概率近乎于0。

版本1——date-time & MAC address
基于时间戳及MAC地址的UUID实现。它包括了48位的MAC地址和60位的时间戳。
版本2——date-time Mac address
RFC没有提供具体的实现细节,以至于大部分的UUID库都没有实现它,只在特定的场景(DCE security)才会用到。所以绝大数情况,我们也不会碰到它。
版本3,5——namespace name-based
V3和V5都是通过hash namespace的标识符和名称生成的。V3使用MD5作为hash函数,V5则使用SHA-1。
因为里面没有不确定的部分,所以当namespace与输入参数确定时,得到的UUID都是确定唯一的。

uuid -n 3 -v3 ns:URL http://www.baidu.com
2f67490d-55a4-395e-b540-457195f7aa95
2f67490d-55a4-395e-b540-457195f7aa95
2f67490d-55a4-395e-b540-457195f7aa95

可以看到这3个UUID都是一样的。
具体的流程就是

  • 把namespace和输入参数拼接在一起,如"http/http://wwwbaidu.com" ++ “/query=uuid”;
  • 使用MD5算法对拼接后的字串进行hash,截断为128位;
  • 把UUID的Version和variant字段都替换成固定的;
  • 如果需要to_string,需要转为16进制和加上连接符"-"。
    把V3的hash算法由MD5换成SHA-1就成了V5。
    版本4——random
    这个版本使用最为广泛。
uuid -n 5 -v4
a3535b78-69dd-4a9e-9a79-57e2ea28981b
a9ba3122-d89b-4855-85f1-92a018e5c457
7c59d031-a143-4676-a8ce-1b24200ab463
533831da-eab4-4c7d-a3f6-1e2da5a4c9a0
def539e8-d298-4575-b769-b55d7637b51e

其中4位代表版本,2-3位代表variant。余下的122-121位都是全部随机的。即有2的122次方(5.3后面36个0)个UUID。一个标准实现的UUID库在生成了2.71万亿个UUID会产生重复UUID的可能性也只有50%的概率:请添加图片描述
这相当于每秒产生10亿的UUID,持续85年,而把这些UUID都存入文件,每个UUID占16bytes,总需要45 EB(exabytes),比目前最大的数据库(PB)还要大很多倍。

5.UUID的重复概率

Java中UUID使用的是版本4进行的实现,所以由
java.util.UUID类产生的 UUID,128个比特中,有122个比特是随机产生,4个比特标识版本被使用,还有2个标识变体被使用。利用生日悖论,可计算出两笔 UUID 拥有相同值的机率约为
在这里插入图片描述
其中x为 UUID 的取值范围,n为 UUID 的个数。

以下是以 x = 2^{122} 计算出n笔 UUID 后产生碰撞的机率:请添加图片描述
换句话说,每秒产生10亿笔 UUID ,100年后只产生一次重复的机率是50%。如果地球上每个人都各有6亿笔 UUID,发生一次重复的机率是50%。与被陨石击中的机率比较的话,已知一个人每年被陨石击中的机率估计为170亿分之1,也就是说机率大约是0.00000000006 (6 x ),等同于在一年内生产2000亿个 UUID 并发生一次重复。

6.Java实现

Java中 UUID 对版本4进行了实现,原理是由强伪随机数生成器生成伪随机数。

    /**
     * 使用静态工厂来获取版本4(伪随机数生成器)的 UUID
     * Static factory to retrieve a type 4 (pseudo randomly generated) UUID.
     * 这个UUID生成使用了强加密的伪随机数生成器(PRNG)
     * The {@code UUID} is generated using a cryptographically strong pseudo
     * random number generator.
     *
     * @return  A randomly generated {@code UUID}
     */
    public static UUID randomUUID() {
        // 与Random(弱伪随机数生成器)不一样,SecureRandom是强伪随机数生成器,结果不可预测
        // 使用SecureRandom生成随机数,替换version和variant就是 UUID
        SecureRandom ng = Holder.numberGenerator;
 
        byte[] randomBytes = new byte[16];
        ng.nextBytes(randomBytes);
        randomBytes[6]  &= 0x0f;  /* clear version        */
        randomBytes[6]  |= 0x40;  /* set to version 4     */
        randomBytes[8]  &= 0x3f;  /* clear variant        */
        randomBytes[8]  |= 0x80;  /* set to IETF variant  */
        return new UUID(randomBytes);
    }
 
    /**
     * 对版本3的实现,对于给定的字符串(name)总能生成相同的UUID
     * Static factory to retrieve a type 3 (name based) {@code UUID} based on
     * the specified byte array.
     *
     * @param  name
     *         A byte array to be used to construct a {@code UUID}
     *
     * @return  A {@code UUID} generated from the specified array
     */
    public static UUID nameUUIDFromBytes(byte[] name) {
        MessageDigest md;
        try {
            md = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException nsae) {
            throw new InternalError("MD5 not supported", nsae);
        }
        byte[] md5Bytes = md.digest(name);
        md5Bytes[6]  &= 0x0f;  /* clear version        */
        md5Bytes[6]  |= 0x30;  /* set to version 3     */
        md5Bytes[8]  &= 0x3f;  /* clear variant        */
        md5Bytes[8]  |= 0x80;  /* set to IETF variant  */
        return new UUID(md5Bytes);
    }

生成 UUID

// Java语言实现
import java.util.UUID;
 
public class UUIDProvider{
    public static String getUUID(){
        return UUID.randomUUID().toString().replaceAll("-", "");
    }
    public static void main(String[] args) {
        // 利用伪随机数生成版本为4,变体为9的UUID
        System.out.println(UUID.randomUUID());
        
        // 对于相同的命名空间总是生成相同的UUID,版本为3,变体为9
        // 命名空间为"mwq"时生成的UUID总是为06523e4a-9a66-3687-9334-e41dab27cef4
        System.out.println(UUID.nameUUIDFromBytes("mwq".getBytes()));
    }
} 

7.总结:

使用较多的是版本1和版本4,其中版本1使用当前时间戳和MAC地址信息。版本4使用(伪)随机数信息,128bit中,除去版本确定的4bit和variant确定的2bit,其它122bit全部由(伪)随机数信息确定。

因为时间戳和随机数的唯一性,版本1和版本4总是生成唯一的标识符。若希望对给定的一个字符串总是能生成相同的 UUID,使用版本3或版本5。

如果只是需要生成一个唯一ID,你可以使用V1或V4。

  • V1基于时间戳和Mac地址,这些ID有一定的规律(你给出一个,是有可能被猜出来下一个是多少的),而且会暴露你的Mac地址。

  • V4是完全随机(伪)的。
    如果对于相同的参数需要输出相同的UUID,你可以使用V3或V5。

  • V3基于MD5 hash算法,如果需要考虑与其它系统的兼容性的话,就用它,因为它出来得早,大概率大家都是用它的。

  • V5基于SHA-1 hash算法,这个是首选。
    参考
    【0】原文
    【1】什么是UUID
    【2】uuid如何保证一致性
    【3】RFC规范

扩展阅读
MySQL 的 UUID
Leaf——美团点评分布式ID生成系统

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/502496.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[数据库系统] 一、创建表以及使用主键约束(educoder)

1.任务:在数据库中创建一个表。 2.需要掌握: 如何在指定数据库中创建表。 知识点:如何在指定数据库中创建表。 我们先来了解一下在数据库中创建表的规则: CREATE TABLE 表名(字段名,数据类型,字段名,数据类型,.....) 例如&…

Oracle 体系结构

文章目录 Oracle体系结构Oracle的内存结构Oracle的进程结构服务器进程后台进程可选后台进程 物理存储结构逻辑存储结构 概念: Oracle server由Oracle instance和Oracle database组成,Oracle instance由后台进程和共享内存组成,Oracle的实例包…

《走进对象村4》之面向对象的第一大特性——封装

文章目录 🚀文章导读1、封装的概念2、访问限定修饰符3、如何进行封装4、封装的优点: 🚀文章导读 在本篇文章中,将详细的对封装进行总结,文章仅仅是个人的一些理解,如果有错误的地方,还望指出看完…

八岁都能懂:O(N)条件下在N个元素中找出第K小的元素

目录 1 进入情境1-1 金字塔道具1-2 感觉还不够1-3 万能筛子1-4 怎么用呢 2 代码实现2-1 伪代码描述2-2 完整实例c 3 引申3-1 完美的折半舍弃3-2 找出前K小的元素(topK方法)3-3 O(n)效率下求中位数参考资料 1 进入情境 生日,朋友送了一堆弹珠,…

[PyTorch][chapter31][卷积]

前言: 卷积神经网络 是 计算机视觉里面应用非常广泛的一个模型。 卷积神经网络 成功案例 人脸识别,指纹识别等应用. 卷积的本质是图像的特征提取, 在冈萨雷士版本《数字图像处理》处理有专门的章节讲解 各种卷积核,在通讯原理里面&#xff0…

MOD09A1、MYD09A1 文件说明

总体介绍 文件全称为 MODIS Terra/Aqua Surface Reflectance 8-Day L3 Global 500 m。文件名称的示例为 “MOD09A1.A2000337.h11v05.005.2006342055602.hdf”。下载下来的 hdf 包括 13 个子数据集,一个 tile 包括 2400*2400 个像元。各数据集的性质如下表所示。 Sci…

51单片机基础实验1

一.51单片机 51单片机,也称为AT89C51,是一种基于Intel 8051架构的8位单片机。它是广泛应用于嵌入式系统和微控制器领域的常见芯片之一。其具有高度灵活性、可编程性和可靠性,因此被广泛应用于各种应用场景中。 51单片机的主要特点包括&…

三十、组播技术——IGMP、IGMP-snooping、PIM-DM、PIM-SM

文章目录 组播概述1、IP组播通信概念2、组播和单播ip地址3、组播MAC4、组播应用场景5、PIM、IGMP、IGMP-snooping 一、IGMP 协议二、PIM DM(密集模式)1、配置示例如下:2、PIM DM的局限性 三、PM SM(稀疏模式) 组播概述…

【python学习】基础篇-文件与系统-os 模块及 os.path 相对路径与绝对路径

在 Python 中,内置了os 模块及其子模块 ospath,用于对目录或文件进行操作。 在使用 os 模块或者 os.path 模块时,应首先使用 import 语句将其导入,然后才可以使用它们提供的函数或方法。 1、常用操作目录函数 2.相对路径与绝对路…

如何手写一个支持H.265的高清播放器

概述 音视频编解码技术在当前的互联网行业中十分热门,特别是高清视频播放器的开发,其中包括4K、8K等超高清分辨率的播放器,具有极高的市场需求和广泛的应用场景。H265编码技术更是实现高清视频压缩的重要手段之一。如果想要掌握音视频编解码…

微服务部署:蓝绿发布、滚动发布、灰度发布、金丝雀发布

前言 在项目迭代的过程中,不可避免需要上线。上线对应着部署,或者重新部署;部署对应着修改,修改则意味着风险。 1.蓝绿发布(Blue/Green Deployment) ①定义 蓝绿部署是不停老版本,部署新版本然后进行测试。确认OK后将流量切到新…

ADSP21489之CCES开发笔记(十一)

一、主模式固件加载: 1、激活SPICLK信号,并将SPI_FLG0_O引脚拉低。 2、将读取命令0x03和24位地址0x000000写入从设备。如图24-4所示。 图24-4 二、PCAG时钟选择与配置。 1、来源晶振 2、来源Pin脚 其中来源Pin脚配置PCAG时,需将PCG_CTLx1上加…

如何生成api接口获取宝贝商品详情,商品详情接口,产品详情

API (Application Programming Interface)是指应用程序接口,它是一种通过编写一组统一的规则,开发一个软件来与其他应用程序进行通讯的技术。API可以方便应用程序之间的交流和数据共享,以及增强应用程序的功能。 在现代应用程序中&#xff0…

23.自定义指令

像是 v-if,v-for,v-model 这些是官方指令,vue允许开发者自定义指令 目录 1 mounted 1.1 基本使用 1.2 第一个形参 1.3 第二个形参 2 updated 3 函数简写 4 全局自定义指令 1 mounted 当指令绑定到元素身上的时候,就会自动触发mounted()…

MySQL---基本操作DQL(基本查询语法,算术运算符,比较运算符,逻辑运算符,位运算符)

1. 基本查询语法 select [all|distinct] <目标列的表达式1> [别名], <目标列的表达式2> [别名]... from <表名或视图名> [别名],<表名或视图名> [别名]... [where<条件表达式>] [group by <列名> [having <条件表达式>]] [o…

【Mysql】数据更新过程redo log、脏页 到磁盘文件

简介 Mysq 执行一条SQL记录时&#xff0c;会首先将数据写入 redo log&#xff0c;然后更新到内存上&#xff0c;等到满足特定条件之后&#xff0c;才将数据写入到数据库磁盘文件。 redo log也保存在磁盘上&#xff0c;和数据库磁盘文件的区别&#xff0c;在于写入的方式。red…

asp.net+sqlserver企业财务管理系统

1 系统概述5 1.1 研究的背景5 1.2 研究的意义5 1.3 主要研究内容6 2 系统开发环境6 2.1开发工具介绍6 2.1.1 Visual Studio介绍6 2.1.2 SQL Server介绍7 2.1.3 IIS介绍8 2.2 动态网站技术介绍8 2.3开发模式B/S介绍8 3 需求分析9 3.1 需求分析9 3.1.1系统用户需求9 3.1.2系统功能…

Vue学习笔记2 - Vue常用指令

上一章 【Vue学习笔记2 -naxVue是什么 】讲了Vue的基本概念。 本章来学习一下Vue常用指令。 1&#xff0c;v-text 绑定文本 2&#xff0c;v-html 绑定 html 3&#xff0c;v-for for循环 4&#xff0c;v-show 显示/隐藏 5&#xff0c;v-if/v-esle-if/v-else 条件式 6&…

open3d 源码阅读octree_*.py

目录 1. 从点云中创建octree 2. 从体素网格中创建octree 3. 遍历octree 1. 从点云中创建octree octree_find_leaf.py convert_from_point_cloud 建立octree&#xff0c;查询点云中某个点在octree中哪个叶子节点。 # --------------------------------------------------…

Redis(连接池)

SpringBoor环境下使用redis连接池 依赖&#xff1a; <dependencies><dependency><groupId>com.yugabyte</groupId><artifactId>jedis</artifactId><version>2.9.0-yb-11</version></dependency><dependency><…