UUID - 通用唯一识别码

通用唯一识别码(英语:Universally Unique Identifier,UUID),是用于计算机体系中以识别信息数目的一个 128 位标识符,还有相关的术语:全局唯一标识符(GUID)。

根据标准方法生成,不依赖中央机构的注册和分配,UUID 具有唯一性,这与其他大多数编号方案不同。重复 UUID 码概率接近零,可以忽略不计。

其目的,是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。如此一来,每个人都可以创建不与其它人冲突的 UUID。在这样的情况下,就不需考虑数据库创建时的名称重复问题。

定义

UUID 是由一组 32 位数的 16 进制数字所构成,是故 UUID 理论上的总数为 1632=212816^{32} = 2^{128}1632=2128 ,约等于 3.4×10383.4 \times 10^{38}3.4×1038 。也就是说若每纳秒产生 1 兆个 UUID,要花 100 亿年才会将所有 UUID 用完。

UUID 的标准型式包含 32 个 16 进制数字,以连字号分为五段,形式为 8-4-4-4-12 的 32 个字符。示例: 376f844e-4df4-4743-8d91-60148b76b9de

UUID 数据规模对比

分类 数据量 单位 数字
一张电报 100 B B 1
一个笑话 1 KB KB 1,024
一页书籍 10 KB
一张低分辨率照片 100 KB
一部微型小说 1 MB MB 1,048,576
一次胸透视 10 MB
一章百科全书 50 MB
一部广播级质量电影 1 GB GB 1,073,741,824
一卷大型数字磁带 100 GB
五万棵树制成的纸 1 T8 TB 1,099,511,627,776
一套大型存储系统 50 TB
NASA EOS 对地观测系统三年数据 1 PB PB 1,125,899,906,842,624
所有印刷材料 200 PB
全人类说过的所有的话 5 EB EB 1,152,921,504,606,846,976
2020 年全球预计数据量 45 ZB ZB 1,180,591,620,717,411,303,424
1 YB YB 1,208,925,819,614,629,174,706,176
1 NB NB 1,237,940,039,285,380,274,899,124,224
1 DB DB 1,267,650,600,228,229,401,496,703,205,376
GUID 340,282,366,920,938,463,463,374,607,431,768,211,456

格式

在其规范的文本表示中,UUID 的 16 个 8 位字节表示为 32 个十六进制(基数 16)数字,显示在由连字符分隔 ‘-’ 的五个组中,“8-4-4-4-12” 总共 36 个字符(32 个字母数字字符和 4 个连字符)。例如:

b8b6564e-2011-42aa-828f-bcc52443c4d4

xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx

四位数字 M 表示 UUID 版本,数字 N 的一至三个最高有效位表示 UUID 变体。在例子中,M 是 4 而且 N 是 8 (10xx),这意味着此 UUID 是 “变体 1”、“版本 4” UUID;

N:变体 0 (0xxx),变体 1 (10xx),变体 2 (11xx),变体 3 (111x)。目前使用 变体 1,所以只能是 89ab 中的一个。

M:目前 UUID 标准只有 5 个版本,所以只会是 12345

规范的 8-4-4-4-12 格式字符串基于 UUID 的 16 个字节(128 bit)的 “记录布局”:

UUID record layout

Name Length (bytes) Length (hex digits) Contents
time_low 4 8 整数:低位 32 bits 时间
time_mid 2 4 整数:中间位 16 bits 时间
version time_hi 2 4 最高有效位中的 4 bits “版本”,后面是高 12 bits 的时间
res clock_seq_hi clock_seq_low 2 4 最高有效位为 1-3 bits “变体”,后跟 13-15 bits 时钟序列
node 6 12 48 bits 节点 ID

UUID 变体(Variants)

为了能兼容过去的 UUID,以及应对未来的变化,因此有了变体(Variants)这一概念。目前已知的变体有如下几种:

variant 0:0xxx。为了向后兼容预留。
variant 1:10xx。当前正在使用的。
variant 2:11xx。为早期微软 GUID 预留。
variant 3:111x。为将来扩展预留。目前暂未使用。

因此,可以认为,目前正在使用的 UUID 都是 variant1,取值是 89ab 中的一个。

UUID 版本(Version)

version 1:0001。基于时间和 MAC 地址。由于使用了 MAC 地址,因此能够确保唯一性,但是同时也暴露了 MAC 地址,私密性不够好。
version 2:0010。DCE 安全的 UUID。该版本在规范中并没有仔细说明,因此并没有具体的实现。
version 3:0011。基于名字空间 (MD5)。用户指定一个名字空间和一个字符串,通过 MD5 散列,生成 UUID。字符串本身需要是唯一的。
version 4:0100。基于随机数。虽然是基于随机数,但是重复的可能性可以忽略不计,因此该版本也是被经常使用的版本。
version 5:0101。基于名字空间 (SHA1)。跟 Version 3 类似,但是散列函数编程了 SHA1。

UUID 版本 1 (时间 + MAC 地址)

60 bit 时间戳(time_low + time_mid + time_hi) + 48 bit MAC地址(node) + 13/14 bit 时钟序列(clock_seq_hi clock_seq_low)。

60 bit 时间戳:以 1582 年 10 月 15 日午夜起协调世界时(UTC)以来的 100 纳秒间隔数,最大日期在公元 3400 年左右(RFC 4122,只用了 59 bit),所以这个 60 bit 时间戳是有符号的(最高位表示正负)。但是某些软件会将其视为无符号,最大日期为公元 5236 年。

48 bit MAC地址:来自生成 UUID 的计算机。但是依赖于计算机设备,且暴露了 MAC 地址不安全。

13/14 bit 时钟序列:扩展了时间戳,尽可能避免短时间内生成两组相同 UUID 的风险(主要是网络多设备生成 UUID 碰撞),与 60 bit 时间戳能够组成 74 bit 的时间信息。

UUID 版本 2 (时间 + MAC 地址,DCE 安全版本)

RFC 4122 保留了 “DCE security” UUID 的 “版本 2” ; 但它没有提供任何细节。因此,许多 UUID 实现省略了 “版本 2” 。

这里不做介绍。

UUID 版本 3 (名字空间 MD5 散列)

用户指定一个名字空间和一个字符串,通过 MD5 散列生成 UUID。

这个版本的 UUID 保证了:相同名字空间中不同名字生成的 UUID 的唯一性;不同名字空间中的 UUID 的唯一性;相同名字空间中相同名字的 UUID 重复生成是相同的。

MD5 算法能够生成 128 bit 的数据,然后将其中的 4 bit 改为固定的版本号(version),1-3 bit 改为变体(Variants)。

UUID 版本 4 (随机)

4 bit 为固定的版本号(version),1-3 bit 改为变体(Variants),其它为随机生成。

理论上各个设备生成的随机数,重复的可能性很低。

但是由于一些伪随机数发生器缺少必要的熵来产生足够的伪随机数。如果不能很好的保证随机性,建议采用版本 3 或版本 5 生成 UUID。

UUID 版本 5 (名字空间 SHA1 散列)

与版本 3 类似,用户指定一个名字空间和一个字符串,通过 SHA1 生成 UUID。(其中使用的字符串必须唯一)

只是 SHA1 生成 160 bit 的散列,需要截断为 128 bit。

UUID - 通用唯一识别码相关推荐

  1. java生成UUID通用唯一识别码

    一.UUID概述 UUID含义是通用唯一识别码 (Universally Unique Identifier),这是一个软件建构的标准,也是被开源软件基金会 (Open Software Founda ...

  2. UUID 通用唯一识别码(Universally Unique Identifier)介绍

    UUID 简介 UUID 是 通用唯一识别码(Universally Unique Identifier)的缩写,是一种软件建构的标准,亦为开放软件基金会组织在分布式计算环境领域的一部分.其目的,是让 ...

  3. uuid通用唯一识别码

    https://www.npmjs.com/package/uuid 1.安装 npm install uuid 2.使用 import { v4 as uuid } from 'uuid'; uui ...

  4. golang生成UUID通用唯一识别码

    大多数推荐github上现成的包 https://github.com/satori/go.uuid package mainimport("fmt""github.co ...

  5. 通用唯一识别码UUID

    UUID是通用唯一识别码(Universally Unique Identifier)的缩写.UUID 的目的,是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指 ...

  6. 通用唯一识别码(uuid):吃透id随便搞

    Index v4 高64位 mostSigBits 低64位 leastSigBits v3 高64位 mostSigBits 低64位 leastSigBits v1 高64位 mostSigBit ...

  7. 云客Drupal源码分析之通用唯一识别码UUID

    先来看一个问题:假设一个网络系统每秒钟需要保存数十万来自用户提交的信息,并分配一个id给每条信息用于以后唯一标识它,那么怎么产生这个id呢?不能重复又要足够快以支持高并发,有这么强大的单台服务器吗?即 ...

  8. 用于分布式系统的ID?——UUID(Universally Unique Identifier,通用唯一识别码)

    用于分布式系统的ID?--UUID(Universally Unique Identifier,通用唯一识别码) UUID 是 通用唯一识别码(Universally Unique Identifie ...

  9. _02_使用UUID获取唯一标识

    [文章标题:_02_使用UUID获取唯一标识] [202012-29 03:39:00] 需求: ​ 很多时候我们会需要用到 生成不重复的唯一标识的 的功能,如数据库表中的主键等. 实现: ​ 使用U ...

最新文章

  1. 【快乐水题】1688. 比赛中的配对次数
  2. 浏览器预连接性能测试
  3. 全连接神经网络_【模型解读】从“局部连接”回到“全连接”的Non-Local神经网络...
  4. 收藏 | 李飞飞经典CS231N《卷积神经网络视觉识别》第十一讲!
  5. 点击高德地图标注没法弹窗_如何在地图上标注我的店铺
  6. for循环之性能优化
  7. ReactNative组件导出
  8. python入门经典100例-Python3经典100例(含习题答案) DOC 清晰版
  9. 毕设题目:Matlab智能算法VRP(车辆路径规划)
  10. 修改apache2根目录
  11. 误删除vmdk文件恢复办法
  12. RecyclerView或是ListView(列表)点击某个条目保持选中【非常巧妙】
  13. 2022年场(厂)内专用机动车辆安全管理考试模拟100题模拟考试平台操作
  14. 在Ubuntu上安装MySQL8.0数据库并使用Navicat远程访问
  15. 【学习笔记】行人异常行为检测的综述
  16. 拼多多商家想做好推广一定不能这么做!
  17. 【人工智能】全球老外正跟你同步修仙!AI垂直文本翻译助力国产网文出海,规模将达300亿!...
  18. 成功解决笔记本重装系统后没有无线网
  19. 葡萄城让低代码之光照进软件厂商的心田
  20. [安全攻防进阶篇] 二.如何学好逆向分析、逆向路线推荐及吕布传游戏逆向案例

热门文章

  1. 智能小车红外避障原理
  2. IT人才需求稳中有升 3D打印人才需求大
  3. 在阿里云ECS服务器上搭建tomcat
  4. 【web前端性能优化】13.城市三级联动
  5. chatgpt赋能python:Python调试技巧:如何使用断点运行程序
  6. Speedoffice(PPT)如何修改幻灯片版式
  7. 手机百度网盘倍速播放的方法步骤
  8. 微信小程序怎么弄成链接_教你设置小程序链接地址
  9. 情绪识别数据集汇总心电相关and申请方法详细描述 呕心沥血之作 全网唯一 AMIGOS ASCERTAIN CLAS DECAF DREAMER MANHOB-HCI MPED SWELL
  10. Linu系统(笔记版)