精华内容
下载资源
问答
  • UUID(Universally Unique IDentifier)是一个128位数字的唯一标识。RFC 4122描述了具体的规范实现。本文尝试从它的结构一步步分析为什么它能做到唯一性?及各个版本的使用场景。FormatUUID使用16进制表示,共有36个...

    fd6b60ed6de1f553542431cc79996cae.png

    UUID(Universally Unique IDentifier)是一个128位数字的唯一标识。RFC 4122描述了具体的规范实现。本文尝试从它的结构一步步分析为什么它能做到唯一性?及各个版本的使用场景。

    Format

    UUID使用16进制表示,共有36个字符(32个字母数字+4个连接符"-"),格式为8-4-4-4-12,如:

    6d25a684-9558-11e9-aa94-efccd7a0659b
    xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx

    M中使用4位来表示UUID的版本,N中使用1-3位表示不同的variant。如上面所示:M =1, N = a表示此UUID为version-1,variant-1的UUID(Time-based ECE/RFC 4122 UUID)。

    但是为什么最开始说它是一个128位的唯一标识呢?这里明明字母位数是(8+4+4+4+12)*8=256位。

    因为上面的字母是用的16进制,一个16进制只代表4个bit,所以应该是(8+4+4+4+12)*4=128位。

    UUID使用的是大数位format(big-endian),比如:

    00112233-4455-6677-8899-aabbccddeeff 编码就是 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff.

    UUID现有5种版本,是根据不同的使用场景划分的,而不是根据精度,所以Version5并不会比Version1精度高,在精度上,大家都能保证唯一性,重复的概率近乎于0

    Version1(date-time MAC address)

    基于时间戳及MAC地址的UUID实现。它包括了48位的MAC地址和60位的时间戳,

    接下来使用ossp-uuid命令行创建5个UUID v1。(在Mac安装brew install ossp-uuid)

    uuid -n 5 -v1
    5b01c826-9561-11e9-9659-cb41250df352
    5b01cc7c-9561-11e9-965a-57ad522dee7f
    5b01cea2-9561-11e9-965b-a3d050dd0f99
    5b01cf60-9561-11e9-965c-1b66505f58da
    5b01d118-9561-11e9-965d-97354eb9e996

    肉眼一看,有一种所有的UUID都很相似的感觉,几乎就要重复了!怎么回事?

    其实v1为了保证唯一性,当时间精度不够时,会使用13~14位的clock sequence来扩展时间戳,比如:

    当UUID的生产成速率太快,超过了系统时间的精度。时间戳的低位部分会每增加一个UUID就+1的操作来模拟更高精度的时间戳,换句话说,就是当系统时间精度无会区分2个UUID的时间先后时,为了保证唯一性,会在其中一个UUID上+1。所以UUID重复的概率几乎为0,时间戳加扩展的clock sequence一共有74bits,(2的74次方,约为1.8后面加22个零),即在每个节点下,每秒可产生1630亿不重复的UUID(因为只精确到了秒,不再是74位,所以换算了一下)。

    相对于其它版本,v1还加入48位的MAC地址,这依赖于网卡供应商能提供唯一的MAC地址,同时也可能通过它反查到对应的MAC地址。Melissa病毒就是这样做到的。

    Version2(date-time Mac address)

    这是最神秘的版本,RFC没有提供具体的实现细节,以至于大部分的UUID库都没有实现它,只在特定的场景(DCE security)才会用到。所以绝大数情况,我们也不会碰到它。

    Version3,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都是一样的。

    具体的流程就是

    1. 把namespace和输入参数拼接在一起,如"http/http://wwwbaidu.com" ++ "/query=uuid";
    2. 使用MD5算法对拼接后的字串进行hash,截断为128位;
    3. 把UUID的Version和variant字段都替换成固定的;
    4. 如果需要to_string,需要转为16进制和加上连接符"-"。

    把V3的hash算法由MD5换成SHA-1就成了V5。

    Version4(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)还要大很多倍。

    Summary

    • 如果只是需要生成一个唯一ID,你可以使用V1或V4。
      - V1基于时间戳和Mac地址,这些ID有一定的规律(你给出一个,是有可能被猜出来下一个是多少的),而且会暴露你的Mac地址。
      - V4是完全随机(伪)的。
    • 如果对于相同的参数需要输出相同的UUID,你可以使用V3或V5。
      - V3基于MD5 hash算法,如果需要考虑与其它系统的兼容性的话,就用它,因为它出来得早,大概率大家都是用它的。
      - V5基于SHA-1 hash算法,这个是首选。

    更好的阅读体验:

    UUID如何保证唯一性notes.tried.cc
    9708ce4daa76d829340f14096d109dcf.png
    展开全文
  • UUID如何保证唯一性的

    千次阅读 2020-01-08 23:13:40
    文章目录UUID涵义UUID的版本UUID的应用 ...为了保证UUID唯一性,规范定义了包括网卡MAC地址、时间戳、名字空间(Namespace)、随机或伪随机数、时序等元素,以及从这些元素生成UUID的算法。UUID...


    UUID的唯一是根据硬件特征,那么,如果在虚拟机里呢?生成两个完全相同的虚拟机,然后让他们在同一时间生成UUID。。。会得到相同的UUID吗?

    UUID涵义

    • 经由一定的算法机器生成
      为了保证UUID的唯一性,规范定义了包括网卡MAC地址、时间戳、名字空间(Namespace)、随机或伪随机数、时序等元素,以及从这些元素生成UUID的算法。UUID的复杂特性在保证了其唯一性的同时,意味着只能由计算机生成。
    • 非人工指定,非人工识别
      在特定的范围内重复的可能性极小
    • 在特定的范围内重复的可能性极小
      UUID的生成规范定义的算法主要目的就是要保证其唯一性。但这个唯一性是有限的,只在特定的范围内才能得到保证,这和UUID的类型有关(参见UUID的版本)。

    UUID的版本

    UUID具有多个版本,每个版本的算法不同,应用范围也不同。
    首先是一个特例--Nil UUID--通常我们不会用到它,它是由全为0的数字组成,如下:
    00000000-0000-0000-0000-000000000000

    • UUID Version 1:基于时间的UUID

    基于时间的UUID通过计算当前时间戳、随机数和机器MAC地址得到。由于在算法中使用了MAC地址,这个版本的UUID可以保证在全球范围的唯一性。但与此同时,使用MAC地址会带来安全性问题,这就是这个版本UUID受到批评的地方。如果应用只是在局域网中使用,也可以使用退化的算法,以IP地址来代替MAC地址--Java的UUID往往是这样实现的(当然也考虑了获取MAC的难度)。

    • UUID Version 2:DCE安全的UUID

    DCE(Distributed Computing
    Environment)安全的UUID和基于时间的UUID算法相同,但会把时间戳的前4位置换为POSIX的UID或GID。这个版本的UUID在实际中较少用到。

    • UUID Version 3:基于名字的UUID(MD5)

    基于名字的UUID通过计算名字和名字空间的MD5散列值得到。这个版本的UUID保证了:相同名字空间中不同名字生成的UUID的唯一性;不同名字空间中的UUID的唯一性;相同名字空间中相同名字的UUID重复生成是相同的。

    • UUID Version 4:随机UUID

    根据随机数,或者伪随机数生成UUID。这种UUID产生重复的概率是可以计算出来的,但随机的东西就像是买彩票:你指望它发财是不可能的,但狗屎运通常会在不经意中到来。

    • UUID Version 5:基于名字的UUID(SHA1)

    和版本3的UUID算法类似,只是散列值计算使用SHA1(Secure Hash Algorithm 1)算法。

    UUID的应用

    从UUID的不同版本可以看出,
    Version 1/2适合应用于分布式计算环境下,具有高度的唯一性;
    Version 3/5适合于一定范围内名字唯一,且需要或可能会重复生成UUID的环境下;
    Version4是用的最广泛也是最简单方便的

    通常我们建议使用UUID来标识对象或持久化数据,但以下情况最好不使用UUID:

    • 映射类型的对象。比如只有代码及名称的代码表。
    • 人工维护的非系统生成对象。比如系统中的部分基础数据。
    • 对于具有名称不可重复的自然特性的对象,最好使用Version 3/5的UUID。比如系统中的用户。如果用户的UUID是Version1的,如果你不小心删除了再重建用户,你会发现人还是那个人,用户已经不是那个用户了。(虽然标记为删除状态也是一种解决方案,但会带来实现上的复杂性。)
    展开全文
  • 为了保证UUID唯一性,规范定义了包括网卡MAC地址、时间戳、名字空间(Namespace)、随机或伪随机数、时序等元素,以及从这些元素生成UUID的算法。UUID的复杂特性在保证了其唯一性的同时,意味着只能由计算机生成。...

    UUID具有以下涵义:

    经由一定的算法机器生成
    为了保证UUID的唯一性,规范定义了包括网卡MAC地址、时间戳、名字空间(Namespace)、随机或伪随机数、时序等元素,以及从这些元素生成UUID的算法。UUID的复杂特性在保证了其唯一性的同时,意味着只能由计算机生成。

    非人工指定,非人工识别
    UUID是不能人工指定的,除非你冒着UUID重复的风险。UUID的复杂性决定了“一般人“不能直接从一个UUID知道哪个对象和它关联。

    在特定的范围内重复的可能性极小
    UUID的生成规范定义的算法主要目的就是要保证其唯一性。但这个唯一性是有限的,只在特定的范围内才能得到保证,这和UUID的类型有关(参见UUID的版本)。

    UUID的版本

    UUID具有多个版本,每个版本的算法不同,应用范围也不同。
    首先是一个特例--Nil UUID--通常我们不会用到它,它是由全为0的数字组成,如下:
    00000000-0000-0000-0000-000000000000

    UUID Version 1:基于时间的UUID
    基于时间的UUID通过计算当前时间戳、随机数和机器MAC地址得到。由于在算法中使用了MAC地址,这个版本的UUID可以保证在全球范围的唯一性。但与此同时,使用MAC地址会带来安全性问题,这就是这个版本UUID受到批评的地方。如果应用只是在局域网中使用,也可以使用退化的算法,以IP地址来代替MAC地址--Java的UUID往往是这样实现的(当然也考虑了获取MAC的难度)。

    UUID Version 2:DCE安全的UUID
    DCE(Distributed Computing Environment)安全的UUID和基于时间的UUID算法相同,但会把时间戳的前4位置换为POSIX的UID或GID。这个版本的UUID在实际中较少用到。

    UUID Version 3:基于名字的UUID(MD5)
    基于名字的UUID通过计算名字和名字空间的MD5散列值得到。这个版本的UUID保证了:相同名字空间中不同名字生成的UUID的唯一性;不同名字空间中的UUID的唯一性;相同名字空间中相同名字的UUID重复生成是相同的。

    UUID Version 4:随机UUID
    根据随机数,或者伪随机数生成UUID。这种UUID产生重复的概率是可以计算出来的,但随机的东西就像是买彩票:你指望它发财是不可能的,但狗屎运通常会在不经意中到来。

    UUID Version 5:基于名字的UUID(SHA1)
    和版本3的UUID算法类似,只是散列值计算使用SHA1(Secure Hash Algorithm 1)算法。

    UUID的应用

    从UUID的不同版本可以看出,
    Version 1/2适合应用于分布式计算环境下,具有高度的唯一性;
    Version 3/5适合于一定范围内名字唯一,且需要或可能会重复生成UUID的环境下;
    至于Version 4,个人的建议是最好不用(虽然它是最简单最方便的)。
    通常我们建议使用UUID来标识对象或持久化数据,但以下情况最好不使用UUID:
    映射类型的对象。比如只有代码及名称的代码表。
    人工维护的非系统生成对象。比如系统中的部分基础数据。
    对于具有名称不可重复的自然特性的对象,最好使用Version 3/5的UUID。比如系统中的用户。如果用户的UUID是Version 1的,如果你不小心删除了再重建用户,你会发现人还是那个人,用户已经不是那个用户了。(虽然标记为删除状态也是一种解决方案,但会带来实现上的复杂性。)

    展开全文
  • UUID由以下几部分的组合: (1)当前日期和时间,UUID的第一个部分与时间...(3)全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得。 转载于:https://www.cnblogs.com/xiohao/p/...
    UUID由以下几部分的组合:
    (1)当前日期和时间,UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同。
            据说时间粒度很小
    (2)时钟序列。
    (3)全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得。

    转载于:https://www.cnblogs.com/xiohao/p/5863608.html

    展开全文
  • UUID(Universally Unique IDentifier)是一个128位数字的唯一标识。RFC 4122描述了具体的规范实现。本文尝试从它的结构一步步分析为什么它能做到唯一性?及各个版本的使用场景。 Format UUID使用16进制表示,共有36...
  • 如何生成具有唯一性的uuid

    千次阅读 2018-05-31 16:23:32
    Python使用UUID库生成唯一ID UUID是128位的全局唯一标识符... 它可以保证时间和空间的唯一性,也称为GUID,全称为: UUID —— Universally Unique IDentifier Python 中叫 UUID GUID —— Globally Unique IDenti...
  • 常用的方式有 UUID、SnowFlake、TicketServer UUID ...它通过MAC地址、时间戳、命名空间、随机数、伪随机数来保证生成ID的唯一性。 UUID主要有五个算法,也就是五种方法来实现: uuid1()——基于...
  • 自增主键和UUID主键的优缺点及适用场景 我们首先考虑效率和存储空间,然后再考虑安全和分布式 使用自增主键 优点: 1、数据存储空间小 2、查询效率高 缺点: 1、如果数据量过大,会超出自增长的值范围 2、分布式存储的表...
  • ...UUID是指一台机器上生成的数字,它保证对同一时空中得所有机器都是唯一的. MAC地址,或称为MAC位址,或称为MAC位址,硬件位址,用来定义网络设备的位址.在OSI模型中,第三层网络层负责IP地
  • 如何保证获取到的UUID能够唯一标识每一台设备呢?我们知道通过UIDevice可以获取到UUIDString,但是如果App被删除了然后重新安装,就会得到不同的UUIDString,这并不是我们希望的。 那么,有什么办法可以解决这个...
  • UUID如何保证唯一性的? 为了保证UUID的唯一性,规范定义了包括网卡MAC地址、时间戳、名字空间(Namespace)、随机或伪随机数、时序等元素。当然,你要说UUID是不是绝对的不会出现重复的,这个也不能这样说的(我...
  • 集群高并发下如何保证分布式唯一全局id生成? id生成规则部分硬性要求: 全局唯一 趋势递增 单调递增 信息安全 含时间戳 id生成系统的可用性要求: 高可用 低延迟 高qps 一般通用方案UUID(只有唯一性) UUID....
  • 如何获取iOS设备的UUID

    2016-06-28 16:04:39
    UDID自从被苹果公司禁止开发者使用,UUID便成为替代品,一般使用UUID的时候,当程序被卸载重装之后,UUID一般会被改变,无法保证唯一。但使用我代码里的方法,便可以保证唯一,即使程序被卸载重装之后也仍然是卸载前...
  • 集群高并发情况下如何保证分布式唯一全局Id生成问题为什么需要分布式全局唯一ID以及分布式ID的业务需求ID生成规则部分硬性要求ID号生成系统的可用性要求一般通用解决方案UUID存在问题数据库自增主键单机集群分布式...
  • 关于UUID

    2019-09-30 22:18:53
    1 UUID的版本 版本1 ...2 UUID如何保证全球唯一 version 1 网卡的mac地址是全球唯一的,除非被克隆,另外时间在流逝,因此自己生成的UUID也是唯一的。 version 3 名字空间是唯一的,再计算m...
  • 获取唯一UUID/UDID方案

    2016-08-10 11:28:00
    如何保证获取到的UUID能够唯一标识每一台设备呢?我们知道通过UIDevice可以获取到UUIDString,但是如果App被删除了然后重新安装,就会得到不同的UUIDString,这并不是我们希望的。 那么,有什么办法可以解决这个...
  • 并且保证生成的id是全局唯一的。 ID生成规则要求: 全局唯一 趋势递增 单调递增 信息安全 含时间戳 ID生成系统的可用性要求: 高可用 低延迟 高QPS 通用解决方案及其问题 UUID 无序的UUID会导致入库性能变差,为...
  • 获取唯一UUID/UDID的方案

    千次阅读 2016-05-26 18:02:17
    如何保证获取到的UUID能够唯一标识每一台设备呢?我们知道通过UIDevice可以获取到UUIDString,但是如果App被删除了然后重新安装,就会得到不同的UUIDString,这并不是我们希望的。 那么,有什么办法可以解决这个...
  • 要求: 1.全局唯一性,不能出现重复的... 1.UUID 通用唯一识别码,16个字节128位的长数字 组成部分:当前时间和时间序列+全局唯一性网卡地址 优点:代码实现简单,不占用宽带,数据迁移不受影响 缺点:无序,无法保证
  • python uuid详解

    2019-12-17 16:55:38
    什么是UUIDUUID(全称为Universally Unique IDentifier)是128位的全局唯一...保证在一定的空间和时间上的唯一性,通常定义用来做唯一标识对象。 python 如何生成UUID python 有uuid模块 分为uuid1(), uuid3(...
  • uuid:通用唯一识别码(Universally Unique Identifier),指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。 UUID.randomUUID().toString(); 优点: 1,隐藏规律 缺点: 1,string类型字符...
  • UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成的API。是一个32位的十六进制序列,使用小横线来连接:8-4-4-4-12 。代码获取的方式:NSLog(@"uuid = %@",[NSUUID ...
  • 获取设备UUID

    千次阅读 2016-04-21 17:51:37
    我们经常需要获取用户设备的唯一标识符,一般来说都是使用的UUID,本文介绍简单的获取UUID的...我们在使用的时候,可以将UUID也保存在Keychain中,这样用户在卸载或者更新的时候,依然可以保证唯一性。关于如何保存在
  • 我们知道,分布式系统,不同的服务部署在不同的机器上,当多个系统同时操作数据库的时候,可能存在id是冲突的情况,此时就产生了一个问题,分布式系统下,如何保证生成的id是唯一的。 分布式系统生成全局唯一id一般...
  • GUID是一个128位长的数字,一般用16进制表示。算法的核心思想是结合机器的网卡、当地时间、一... UUID是1.5中新增的一个类,在java.util下,用它可以产生一个号称全球唯一的ID package com.mytest; import java
  • UUID: (Universally Unique Identifier)全局唯一标识符,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。由以下几部分的组合:当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一...
  • UUID: (Universally Unique Identifier)全局唯一标识符,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。由以下几部分的组合:当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一...
  • 在系统开发中,保证数据的唯一性是至关重要的一件事,目前开发中常用的方式有使用数据库的自增序列、UUID生成唯一编号、时间戳或者时间戳+随机数等。 在某些特定业务场景中,可能会要求我们使用特定格式的唯一编号...

空空如也

空空如也

1 2 3 4 5
收藏数 89
精华内容 35
热门标签
关键字:

uuid如何保证唯一