精华内容
下载资源
问答
  • 前言很多人对UUID处于一种既...阅读下文之前,不妨思考如下个问题:在一个分布式系统中,如何生成全局唯一的uuid?如何生成时间序的UUIDUUID的版本什么意思,version1和version4有什么区别?引子当两台机器...

    d63ace5be4ad22e05279984f98079e29.png

    前言

    很多人对UUID处于一种既熟悉又陌生的状态:“熟悉“是因为给实体(请求,事件等)分配一个唯一标识,与其他实体相区分,是很常见的使用场景。“陌生”是指能明白讲清楚UUID的生成逻辑和选取理由的少之又少。阅读下文之前,不妨思考如下几个问题:

    • 在一个分布式系统中,如何生成全局唯一的uuid?
    • 如何生成时间序的UUID?
    • UUID的版本是什么意思,version1和version4有什么区别?

    引子

    当两台机器需要相互交换信息的时候,他们就需要各自有一个唯一的标识符(名字)。历史上第一个可称为网络(network)的东西是建于1870s的电话网络,在此之前,电话通信完全是点对点的,这样的网络无意是昂贵、低效、不方便的(见题图,光是铜线的消耗就很可观)。

    交换机的出现是电话史上的一个重大发明,每家只需要一条电话线连接到电话局,由它转接到目标电话(从网状拓扑变成星型图谱),由此带来了每部电话的唯一标识符——电话号码。

    进入计算机时代之后,人们发现实体(Entity)这个概念的粒度一下子变小了:从物理实体(电话号码),提升到了逻辑概念(数据)。数据不只在一个地方,而是会在网络节点内部流转,需要持久化的保存。带来对UUID的根本需求:对业务域内(订单,数据库记录)的所有实体(通常关系上是平等的)赋予可相互区别的标识符(唯一性,不重复)。评估一个UUID算法的算法有如下角度:

    • 唯一性:在取值空间内的碰撞概率有多大。最重要的属性。
    • 随机性(可选):生成的UUID分布是否均匀
    • 有序性(可选):是否有拓展的属性能力,比如时间上有先后顺序的两个uuid在字典序上也有一样的顺序。
    • 隐蔽性(可选):是否会额外暴露内部的信息,比如某些用mac地址或者ip计算uuid的算法,就存在暴露内部信息的风险。用数字做订单的唯一标识符,则会让竞争对手估算出商业数据。
    • 依赖性(可选):每个节点生成uuid时候是否依赖其他中心化节点,相互之间是否要沟通。

    标准定义

    UUID的标准定义来自IETF的RFC 4122,UUID是由一组32位数的16进制数字所构成,故UUID理论上的总数为16^32=2^128,约等于3.4 x 10^38。也就是说若每纳秒产生1兆个UUID,要花100亿年才会将所有UUID用完。具体实现定义了五个版本,详见wiki,其中常用的是版本1(时间序)和版本4(随机)。其他版本2是版本1的DCE安全版本,被很多UUID实现忽略。版本3和版本5是基于现有名称映射(前者是散列,后者是SHA1),需要名称本身就具有唯一性(如URI)。这里有个网站:https://uuidonline.com/,可以生成各个版本的uuid找找感觉。

    UUID的标准型式包含32个16进制数字,以连字号分为五段,形式为8-4-4-4-12的32个字符(不算连字符)。示例:

    123e4567-e89b-12d3-a456-426655440000xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx

    第三组数字开头的M表示UUID版本,第四组数字开头的N的1到3个最高有效位表示UUID变体(同一版本的,用来解释某些位),上面例子M是1,N是a(10xx),以为他是按照版本1变体1的逻辑生成的。

    具体实现上,版本1通过在高位引入时间信息,带来uuid的时间顺序,在低位引入位置信息(网卡mac地址),将碰撞的可能通过机器进行隔离。

    时间戳说明:
    timestamp由系统时钟获得,形式为60bit的整数,表示从1582/10/15 00:00:00至今经过的百纳秒数(100 ns= 1e-7 s)。
    将unix timestamp换算为所需时间戳的公式为:ts * 10000000 + 122192928000000000
    time_low = (long long)timestamp [32:64) ,将最低位的32bit按照同样的顺序填入UUID前32bit
    time_mid = (long long)timestamp [16:32) ,将中间的16bit按照同样的顺序填入UUID的time_mid
    time_high = (long long)timestamp [4:16) ,将最高的12bit按照同样的顺序生成time_hi。
    time_hi和version是共享一个short int的,所以其生成方法为:
    time_hi_and_version = (long long)timestamp[0:16) & 0x0111 | 0x1000 

    UUID的第一个分组位域宽度为32bit,以百纳秒表示时间的话,也就是(2 ^ 32 / 1e7 s = 429.5 s = 7.1 min)。即每7分钟,第一个分组经历一次重置循环。所以对于随机到达的请求,生成的ID哈希分布应该是很均匀的。

    UUID的第二个分组位域宽度为16bit,也就是2^48 / 1e7 s = 326 Day,也就是说,第二个分组基本上每年循环一次。可以近似的看做年内的业务日期。

    UUID与JAVA实现

    java使用这面临一个比较尴尬的现状:JDK里目前只有版本4的实现,如果需要使用其他的版本,可以参考JUG开源实现

    https://github.com/cowtowncoder/java-uuid-generatorgithub.com
    题外话:了解JAVA的知道class里有个serialVersionUID,他用在序列化和发序列化的场景区别用的是不是一个版本:如果反序列化的时候发现UID与序列化的UID不一样,则会抛出一个异常InvalidClassException。当你修改了这个类,然后认为是向前兼容的(如增加一个新属性),则不用修改UID的值。反之则要修改该值(如删除或修改了原属性)。
    serialVersionUID如果没有显示生成,虚拟机会按照类名属性自己生成一个,不同虚拟机的实现方案不一样,所以可能同一个类在接收和发送端生成的UID不一样导致反序列化失败,故建议所有序列化的类都由用户显示生成这个值。

    分布式实现

    业界公司并不满足标准实现,对twitter来说,一个现实的需求就是不需要经过中心化节点,就可以对一组推文,按照时间序列进行排序(roughly sorting,只要时间相近的推文在一起即可)。脱离UUID标准定义之后,可以更加高效的利用每一个比特位。这就是snowflake。

    K-ordering:Roughly Sorting的一种更专业的叫法。一个K-ordered Array的K值,来自其中所有元素,距离其正确位置的差距最大不超过K。举例来说:
    数组 A=[1 4 2 6 3 7 5 8]
    其正确的排序位置是 A=[1 2 3 4 5 6 7 8]
    正确元素与其实际位置的差值 [0 1 2 2 2 2 1 0] ,故这个数组的K=2

    基于这个思路,后续推出了flake,克服了snowflake只有64bit,同时依赖三方服务如zookeeper的问题。可惜是erlang实现,网上有按照其思路的java实现。

    参考资料

    • Wiki: Universally unique identifier: https://en.wikipedia.org/wiki/Universally_unique_identifier
    • A brief history of the uuid:https://segment.com/blog/a-brief-history-of-the-uuid/
    展开全文
  • 使用UUID生成32ID

    千次阅读 2011-11-14 11:11:26
    UUID(Universally Unique Identifier)全局唯一标识符,指在一台机器上生成的数字,它保证对在同一时空中的所有机器都唯一的。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码...
    UUID(Universally Unique Identifier)全局唯一标识符,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。由以下几部分的组合:当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同),时钟序列,全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没有网卡以其他方式获得).
    GUID是一个128位长的数字,一般用16进制表示。算法的核心思想是结合机器的网卡、当地时间、一个随机数来生成GUID。从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义上)3240年不重复。
    UUID是1.5中新增的一个类,在java.util下,用它可以产生一个号称全球唯一的ID。
    /**
    * 产生一个32位的GUID
    * @return
    */
    public static String newGUID()
    {
    UUID uuid = UUID.randomUUID();
    return uuid.toString().replace("-", "");
    }


    /**
    * 获取32位GUID
    *
    * @return
    */
    public static String getId() {
    try {
    MessageDigest md = MessageDigest.getInstance("MD5");
    UUID uuid = UUID.randomUUID();
    String guidStr = uuid.toString();
    md.update(guidStr.getBytes(), 0, guidStr.length());
    return new BigInteger(1, md.digest()).toString(16);
    } catch (NoSuchAlgorithmException e) {
    return null;
    }
    }
    展开全文
  • UUID

    2020-09-30 10:34:31
    UUID是1.5中新增的一个类,在java.util下,用它可以产生一个号称全球唯一的ID UUID 的目的,是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。如此一来,每个人都可以...

    UUID

    GUID是一个128位长的数字,一般用16进制表示。算法的核心思想是结合机器的网卡、当地时间、一个随即数来生成GUID。从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义上)3240年不重复。
    UUID是1.5中新增的一个类,在java.util下,用它可以产生一个号称全球唯一的ID

    UUID 的目的,是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。如此一来,每个人都可以建立不与其它人冲突的 UUID

    UUID由以下几部分的组合:

    (1)当前日期和时间,UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同。

    (2)时钟序列。

    (3)全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得。

    JS生成uuid方法

     guid() {
    function S4() {
    return (((1 + Math.random()) * 0x1000) | 0).toString(16).substring(1);
    }
    return (
    S4() +
    S4() +
    "-" +
    S4() +
    "-" +
    S4() +
    "-" +
    S4() +
    "-" +
    S4() +
    S4() +
    S4()
    );
    },
    
    展开全文
  • JS生成uuid种方法

    万次阅读 2017-07-05 09:49:49
    需要注意的声明的接收变量命名时不能使用"uuid"不然会报错----比如 var uuid = uuid(); ...全局唯一标识符(GUID,Globally ...GUID一种由算法生成的二进制长度为128的数字标识符。GUID 的格式为“xxxxxxxx-

    需要注意的是声明的接收变量命名时不能使用"uuid"不然会报错----比如 var uuid = uuid();


    全局唯一标识符(GUID,Globally Unique Identifier)也称作 UUID(Universally Unique IDentifier) 。

    GUID是一种由算法生成的二进制长度为128位的数字标识符。GUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,其中的 x 是 0-9 或 a-f 范围内的一个32位十六进制数。在理想情况下,任何计算机和计算机集群都不会生成两个相同的GUID。

    GUID 的总数达到了2^128(3.4×10^38)个,所以随机生成两个相同GUID的可能性非常小,但并不为0。GUID一词有时也专指微软对UUID标准的实现。

     

    算法1

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function uuid() {
        var s = [];
        var hexDigits = "0123456789abcdef";
        for (var i = 0; i < 36; i++) {
            s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
        }
        s[14] = "4";  // bits 12-15 of the time_hi_and_version field to 0010
        s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1);  // bits 6-7 of the clock_seq_hi_and_reserved to 01
        s[8] = s[13] = s[18] = s[23] = "-";
     
        var uuid = s.join("");
        return uuid;
    }

     

    算法2

    1
    2
    3
    4
    5
    6
    function guid() {
        return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
            var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
            return v.toString(16);
        });
    }

     

    算法3

    1
    2
    3
    4
    5
    6
    function guid() {
        function S4() {
           return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
        }
        return (S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4());
    }

     

    算法4

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    function uuid(len, radix) {
        var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
        var uuid = [], i;
        radix = radix || chars.length;
     
        if (len) {
          // Compact form
          for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random()*radix];
        else {
          // rfc4122, version 4 form
          var r;
     
          // rfc4122 requires these characters
          uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
          uuid[14] = '4';
     
          // Fill in random data.  At i==19 set the high bits of clock sequence as
          // per rfc4122, sec. 4.1.5
          for (i = 0; i < 36; i++) {
            if (!uuid[i]) {
              r = 0 | Math.random()*16;
              uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
            }
          }
        }
     
        return uuid.join('');
    }

    这个可以指定长度和基数。比如

    1
    2
    3
    4
    5
    6
    // 8 character ID (base=2)
    uuid(8, 2)  //  "01001010"
    // 8 character ID (base=10)
    uuid(8, 10) // "47473046"
    // 8 character ID (base=16)
    uuid(8, 16) // "098F4D35"
    展开全文
  • js生成UUID种算法

    2018-06-15 15:06:40
    全局唯一标识符(GUID,Globally Unique Identifier)也称作 UUID(Universally Unique IDentifier) 。 GUID一种由算法生成的二进制长度为128的数字标识符。GUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-...
  • 种表示128位UUID的方法,每当有疑问时,我都希望向Stack Exchange寻求专家意见。 由于通常对表标识符进行索引,因此数据库类型越紧凑,索引所需的空间就越少。 从效率最高到最低,这我们的选择: 某些数据库...
  • UUID.randomUUID()什么

    2017-02-18 15:08:30
    UUID(Universally Unique Identifier)全局唯一标识符,指在一台机器上生成的数字,它保证对在同一时空中的所有机器都唯一的,由一个十六的数字组成,表现出来的形式。由以下部分的组合:当前日期和时间(UUID...
  • 一、UUID是什么UUID就是Universal Unique IDentifier的缩写,它是一个128,16字节的值,并确保在时间和空间上唯一。它是把硬件地址、时间以及随机数结合在一起,它保证对在同一时空中的所有机器都是唯一的。通常...
  • UUID(Universally Unique Identifier)全局唯一标识符,指在一台机器上生成的数字,它保证对在同一时空中的所有机器都唯一的。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码...
  • 随机UUID的生成

    千次阅读 2017-12-04 15:04:11
    UUID介绍UUID是通用唯一识别码(Universally Unique Identifier)的缩写,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。UUID的组成UUID是由一组32位数的16进制数字所构成,以连字号分为...
  • 171207之UUID用法

    2017-12-07 11:22:12
    UUID是由一个十六的数字组成,表现出来的形式例如: 550E8400-E29B-11D4-A716-446655440000 UUID由以下部分的组合: (1)当前日期和时间,UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过秒又...
  • 在之前项目中,数据库生成UUID主键一般会用Java调用函数,最近发现在MySQL也有自带的uuid函数,分别是uuid()和uuid_short(),现对这两个函数进行演示和说明。 在 MySQL 中,可以有如下种途径实现唯一值: (1)自增...
  • 我在美帝读博研究方向就是基于JS的浏览器和机器指纹的生成,@小爝的回答已经很详细了,我来补充下我个月前在信息安全顶会发表的论文的最新进展吧。说实话这方面研究已经很具体了,可以继续研究的余地不大,无非...
  • uuid是128的全局唯一标识符(univeral unique identifier),通常用32的一个字符串的形式来表现。有时也称guid(global unique identifier)。python中自带了uuid模块来进行uuid的生成和管理工作。 python中的uuid...
  • uuid是128的全局唯一标识符(univeral unique identifier),通常用32的一个字符串的形式来表现。有时也称guid(global unique identifier)。python中自带了uuid模块来进行uuid的生成和管理工作。 python中的...
  • UUID.randomUUID().toString()()够造随机UUID

    千次阅读 2017-12-19 11:01:04
    UUID(Universally Unique Identifier)全局唯一标识符,指在一台机器上生成的数字,它保证对在同一时空中的所有机器都唯一的,由一个十六的数字组成,表现出来的形式。由以下部分的组合:当前日期和时间(UUID...
  • uuid原理及使用例子

    2014-11-19 14:23:00
    UUID是128整数(16字节)的全局唯一标识符 由以下部分的组合: 当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过秒又生成一个UUID,则第一个部分不同,其余相同), 时钟序列, ...
  • Python使用UUID库生成唯一ID

    千次阅读 2017-05-01 21:17:33
    UUID是128的全局唯一标识符,通常由32字节的字符串表示。本文介绍了在Python中生成UUID全球唯一标识的种方式
  • UUID与GUID

    千次阅读 2007-08-13 10:31:00
    UUID UUID就是Universal Unique IDentifier的缩写,它一个128,16字节的值,并确保在时间和空间上唯一。通常平台会提供生成UUID的API。UUID按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级...
  • 通用唯一识别码UUID

    2018-11-13 11:03:30
    UUID是通用唯一识别码(Universally Unique Identifier)的缩写。UUID 的目的,是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。如此一来,每个人都可以建立不与其它...
  • UUID.randomUUID()

    2015-08-18 11:07:00
    UUID(Universally Unique Identifier)全局唯一标识符,指在一台机器上生成的数字,它保证对在同一时空中的所有机器都唯一的,由一个十六的数字组成,表现出来的形式。由以下部分的组合:当前日期和时间(UUID...
  • UUID.randomUUID()介绍

    2019-07-06 10:04:11
    由以下部分的组合:当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过秒又生成一个UUID,则第一个部分不同,其余相同),时钟序列,全局唯一的IEEE机器识别号(如果有网卡,从网卡...
  • About UUID and GUID

    2008-03-01 15:46:00
    UUID UUID就是Universal Unique IDentifier的缩写,它一个128,16字节的值,并确保在时间和空间上唯一。通常平台会提供生成UUID的API。UUID按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级...
  • uuid是128的全局唯一标识符(univeral unique identifier),通常用32的一个字符串的形式来表现。有时也称guid(globalunique identifier)。python中自带了uuid模块来进行uuid的生成和管理工作。python中的uuid模块...

空空如也

空空如也

1 2 3 4 5 6
收藏数 119
精华内容 47
关键字:

uuid是几位