UUID介绍

article/2025/9/13 4:08:48

UUID

Universally Unique Identifier:通用唯一识别码

使用某种规则,不是某种中心化的自增方式,来保证这个识别码的全局唯一性

生成规则: RFC4122来进行定义。

根据生日悖论,若每秒产生 10 亿笔 UUID,100 年后只产生一次重复的概率是 50%。如果地球上每个人都各有 6 亿笔 UUID,发生一次重复的概率是 50%。产生重复UUID 并造成错误的情况非常低,是故大可不必考虑此问题。

最早被用于阿波罗网络计算系统(Apollo Network Computing System) 和微软的 Windows 平台,如今 OpenStack 也广泛的使用它来标志计算、存储和网络等资源

GUID :

  • 微软按照 UUID 的规则实现的一套方法。
  • 目的:保证全局唯一性。
  • 微软已经使用 GUID 在 Windows 的 COM,ActiveX 等技术上了。
  • 注意:
    • UUID 本质是有多种版本的,
    • GUID 也是在不同的使用场景实现的是不同的 UUID 版本,
    • 比如 COM 是使用 UUID 版本1 进行实现的

1、构成:

长度:128bit 16字节,换算成16进制数(32个16进制)加上中间杠隔开

格式:xxxx xxxx-xxxx-Mxxx-Nxxx-xxxx xxxx xxxx(8-4-4-4-12)

M:UUID版本,1,2,3,4,5

N:8、5、a、b

可变因子

  • 时间戳
  • 时钟序列
  • 节点信息(机器)—MAC地址

image-20221103094726459

1.1、时间戳

Timestamp

60bit 无符号数

  • version为1:1582-10-15 00:00:000000000 到当前UTC时间,每隔100纳秒加1
  • 对于无法获取UTC时间的系统,统一采用localtime。(实际上一个系统时区相同就可以了)。
  • time_low:0-31bit,32bit
  • time_mid: 32-47bit,16bit
  • time_hi_and_version: 包含两部分,version和time_h1
    • version 占用 bit 数为4. 代表它最多可以支持31个版本(2^4 -1)
    • time_hi:剩余的12bit,一共是16bit

1.2、时钟序列(clock sequence)

  • 如果计算 UUID 的机器进行了时间调整,或者是nodeId变化了(主机更换网卡),和其他的机器冲突了。那么这个时候,就需要有个变量因子进行变化来保证再次生成的 UUID 的唯一性。
  • Clock Sequence的变化算法很简单,当时间调整,或者nodeId变化的时候,直接使用一个随机数/在原先的Clock Sequence值上面自增加一也是可以的。
  • 共14bit
  • clock_seq_low:0-7bit 共8bit
  • clock_seq_hi_and_reserved包含两个部分:
    • clock_seq_hi: 8~13 bit 共6个bit,
    • reserved:2bit,reserved 一般设置为10。
  • 发生时间回调或者更换网卡时:
    • 如果之前的 clock sequence 存在,则增大 clock sequence 的值
    • 如果之前不存在 clock sequence,则随机生成一个 clock sequence

1.3、node - 节点信息(机器)

  • Node 是一个 48 bits 的无符号数,
  • 对于 version 为 1 的 UUID,它选取 IEEE 802 MAC 地址,即网卡的 MAC 地址。
  • 当系统有多块网卡时,任何一块有效的网卡都可被做 Node 数据;
  • 对于没有网卡的系统,取值为随机数。
  • 不同的主机在任何时刻生成的 UUID 均不相同。

2、版本:

统共有5个版本

结构均相同。

这个结构是按照版本1进行定义的,只是在其他版本中,版本1中的几个变量因子都进行了变化。

version1:

  • 严格按照时间戳+时钟序列+节点信息组成变量因子
  • 一些分布式系统场景下是能严格保证全局唯一
  • twitter 的 snowflake 可以看作是是 UUID 版本1 的简化版。
  • 算法:
    1. 从数据表读取(读取需加锁)曾经被用于生成 UUID 的 timestamp, clock sequence 和 node 等信息
    2. 获取当前的 timestamp
    3. 获取当前的 node 信息
    4. 如果第 1 步读取信息失败,或者读取的 node 与当前的 node 不一致,生成一个随机的 clock sequence
    5. 如果 timestamp 比当前的 timestamp 小,clock sequence 调大
    6. 把当前 timestamp,node 和 clock sequence 存入数据表
    7. 根据当前的 timestamp,node 和 clock sequence 生成 UUID,细节如下:
      • time_low 为 timestamp[28:59]
      • time_mid 为 timestamp[12:27]
      • time_hi_and_version[4:15] 为 timestamp[0]…timestamp[11]
      • time_hi_and_version[0:3] 为 0001
      • clock_seq_low 为 clock_sequence[6:13]
      • clock_seq_hi_and_reserved[2:7] 为 clock_sequence[0:5]
      • clock_seq_hi_and_reserved[0:1] 为 10
      • node 为 MAC[0:47]

version2:

  • 基本和版本1一致,
  • 主要多DCE(IBM 的一套分布式计算环境)
  • 参考:https://pubs.opengroup.org/onlinepubs/9668899/chap1.htm
  • 把时间戳的前4位置换为POSIX的UID或GID。
  • 很少使用

version3:

  • 变量因子:基于name和namespace 的hash

  • hash算法:md5

  • 其中的name 和namespace 基本上和我们很多语言的命名空间,类名一样,它的基本要求就是,name + namespace 才是唯一确定hash串的标准

  • 一样的namespace + name 使用相同的hash算法(比如version3的md5)计算出来的结果必须是一样的,但是不同的 namespace 中的同样的 name 生成的结果是不一样的。

    System.out.println(UUID.nameUUIDFromBytes("myString".getBytes("UTF-8")).toString());//version为3
    

version4:

  • 变量因子:随机/伪随机

  • jdk1.8默认使用

  • timestamp,clock sequence, node都是随机或者伪随机的

    System.err.println(UUID.randomUUID().toString());
    

version5:

  • 变量因子:基于name和namespace 的hash
  • hash算法:sha1
  • 同三

http://chatgpt.dhexx.cn/article/2KRECHFX.shtml

相关文章

UID卡、IC卡、ID卡、CUID 卡、FUID 卡、UFUID 卡 有什么区别?

生活中,我们经常用到门禁卡、考勤卡、电梯卡还有停车卡,这些功能是怎么实现的呢?这是靠卡里封装的芯片和线圈来实现各种功能,不同的芯片频率、容量、读写性各不相同,常见的是IC卡还有ID卡。还有一种叫UID的卡&#xff…

M1卡/CUID卡格式化清卡操作方法

CUID卡是一种可以更改0扇区0块的特殊卡,很多朋友发现CUID卡写入一次之后再写就不让写了,认为卡已经废了,其实可以格式化清卡以后变空白卡,再次使用。普通M1卡也可以用该方法清卡,把卡片恢复成空白卡。 一、把CUID卡放读…

机器学习sklearn之SVM推导(三)

针对线性不可分问题,SVM引入了核函数方法,将低维空间的线性不可分问题映射到高维空间,使其变得线性可分。 注意:核函数和映射函数没有关系,只是用来计算计算映射到高维空间之后的内积的一种简便方法。 后面又刷了一遍西…

SVM的基本推导

1、SVM的作用 对于给定的训练样本集D{(x1,y1), (x2,y2),… (xn,yn)},yi属于{-1,1},希望能找出一个超平面,把不同类别的数据集分开,对于线性可分的数据集来说,这样的超平面有无穷多个,而最优的超…

SVM原理及推导过程

SVM简介 SVM核心是最优化方法(带约束条件,拉格朗日乘子法),思想是max(min),即最大化最小间隔(找到最小间隔的点,即支持向量),目标就是求解参数al…

SVM的详细推导

SVM推导: 参考 http://wenku.baidu.com/view/dd807d2fcfc789eb172dc883.html http://wenku.baidu.com/link?urlIJ1D1XtdoQM7qD3JdOE3eBPmN0rJqGDIEmZCG_bWQR8q34ZtT7YqsFtbwHV1RVxCjpt2KgZlqzD-LeOSVNZmO9MQN4YbMZ3eMTHpprQQal7

SVM推导过程注解(一)

前言 支持向量机(Support Vector Machine)的原理其实比较简单,它是基于结构风险最小化理论之上在特征空间中建构最优分割超平面。在二维中就是线,在三维中就是面,但我们统称为超平面。 就我所看到的相关书本、论文以及网上博文情况来看&…

AI面试之SVM推导

SVM现在主流的有两个方法。一个是传统的推导,计算支持向量求解的方法,一个是近几年兴起的梯度下降的方法。 梯度下降方法的核心是使用了hinge loss作为损失函数,所以最近也有人提出的深度SVM其实就是使用hinge loss的神经网络。 本文的目的是…

CS229 SVM 推导和使用心得

这两天要用到SVR的几何解释,特地又翻了CS229 lecture3的笔记。特此记录一下我理解的思路。 从logistic regression引入,说明我们应该更关注于离separating hyperplane近的点,进而引入了margin的概念。 我们想让margin尽量的大,但最直接的functional margin可以通过缩放ω和…

SVM推导过程

推导目标函数 则 w,b等比例缩放,则t*y的值同样缩放,从而: 最大间隔分离超平面: 目标函数: 表示最近点到直线距离尽可能大 函数间隔和几何间隔 分割平面(函数间隔) 。总可以通过等比例缩放w的方法,使…

SVM 推导

参考 http://www.cnblogs.com/jerrylead/archive/2011/03/13/1982639.html http://blog.csdn.net/sinat_22594309/article/details/61615946 http://blog.csdn.net/v_july_v/article/details/7624837 理解SVM 函数间隔->几何间隔->拉格朗日算子->KTT条件 函数间隔 …

SVM 原理详细推导

SVM 原理详细推导 1 硬间隔最大化1.1 函数间隔与几何间隔1.2 间隔最大化1.3 凸二次规划问题求解1.4 一个求解例子 2 软间隔最大化3 线性不可分问题参考 SVM 是一个分类模型,如果训练数据可以完全用一个超平面分开,则称数据集为完全线性可分的&#xff0c…

机器学习笔记:线性SVM推导

什么是SVM 支持向量机简称SVM是最大化分类间隔的线性分类器,如果使用核函数,可以解决非线性问题。支持向量机的目标是寻找一个分类超平面,它不仅能正确的分类每一个样本,并且要使得每一类样本中距离超平面最近的样本到超平面的距…

SVM推导过程浅析

转载请注明出处,原文地址 前言 SVM - support vector machine, 俗称支持向量机,为一种supervised learning算法,属于classification的范畴。本篇文章将会讲述SVM的原理并介绍推导过程。 SVM推导过程 如图,我们有些红色与蓝色点…

svm推导

自己推一遍才印象深刻,CSDN对公式的支持很不好,所以在本地用latex写,并转换成了图片上传

【超详细】支持向量机(SVM)数学推导

目录 一、硬间隔SVM(Hard Margin SVM) 二、对偶问题(Dual Problem) 1.将有约束问题转变为无约束问题 2.强对偶关系 3.计算拉格朗日函数的最小值 4.得到对偶形式 三、对偶形式的求解 1.KKT条件的引入 2.计算w*和b* 四、软间隔SVM(Soft M…

svm原理详细推导

笔者在查阅了大量资料和阅读大佬的讲解之后,终于对svm有了比较深一点的认识,先将理解的推导过程分享如下: 本文主要从如下五个方面进行介绍:基本推导,松弛因子,核函数,SMO算法,小结…

支持向量机SVM推导及求解过程

支持向量机是属于原创性、非组合的具有明显直观几何意义的分类算法,具有较高的准确率。 使用SVM算法的思路:(1)简单情况,线性可分情况,把问题转化为一个凸优化问题,可以用拉格朗日乘子法简化&am…