精华内容
下载资源
问答
  • uuid隐私
    千次阅读
    2022-03-07 14:45:02

    1、UUID概要

    UUID 的全称是 Universally Unique Identifier,中文为通用唯一识别码

    构成:由一组32位数的16进制数字所构成。

    格式:以连字号分为五段,表现形式为8-4-4-4-12的32个字符

    xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
    
    如:30385d15-0a88-42eb-bc43-2c000e9f778c

    其中 M 与 N 都有特殊含义 

    • M 表示 UUID版本,目前只有五个版本,即只会出现1,2,3,4,5(下文会介绍这五个版本)

    • 数字 N 的一至三个最高有效位表示 UUID 变体,目前只会出现 8,9,a,b 四种情况。

    2、UUID 的版本

    v1 (timestamp)

    原理:timestamp + MAC 地址。

    缺点:

    • 机器的MAC地址出厂后不能保证完全唯一,且之后 MAC 地址也可手动修改

    • MAC 地址的暴露会造成了隐私与安全问题

    • 若一台机子上的两个进程同时跑,有可能出现重复问题

    v2 (timestamp)

    原理:基于 v1 的基础上优化了下,更安全。

    v3 (namespace)

    原理:基于 namespace + 输入内容 进行 MD5。

    v4 (random)

    原理:基于随机数。

    这个版本的UUID是使用最多的。

    v5 (namespace)

    原理:跟 V3 差不多,只是把散列算法的 MD5 变成 SHA1。

    二、使用


    1、Node.js

    官方文档:uuid - npm

    安装

    npm install uuid
    

    代码使用

    const uuidv4 = require('uuid/v4');
    
    uuidv4(); // ⇨ '1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed'
    

    CLI 使用

    $ uuid
    ddeb27fb-d9a0-4624-be4d-4615062daed4
    
    $ uuid v4
    30385d15-0a88-42eb-bc43-2c000e9f778c

    更多相关内容
  • Python 模块 UUID 学习使用

    Python 模块 UUID 学习使用

    一、UUID介绍

    UUID: 通用唯一标识符 ( Universally Unique Identifier ), 对于所有的UUID它可以保证在空间和时间上的唯一性. 它是通过MAC地址, 时间戳, 命名空间, 随机数, 伪随机数来保证生成ID的唯一性, 有着固定的大小( 128 bit ). 它的唯一性和一致性特点使得可以无需注册过程就能够产生一个新的UUID. UUID可以被用作多种用途, 既可以用来短时间内标记一个对象, 也可以可靠的辨别网络中的持久性对象.

    为什么要使用UUID?

    很多应用场景需要一个id, 但是又不要求这个id 有具体的意义, 仅仅用来标识一个对象. 常见的例子有数据库表的id 字段. 另一个例子是前端的各种UI库, 因为它们通常需要动态创建各种UI元素, 这些元素需要唯一的id , 这时候就需要使用UUID了.

    二、Python uuid模块介绍

    python的uuid模块提供UUID类和函数uuid1(), uuid3(), uuid4(), uuid5() 来生成1, 3, 4, 5各个版本的UUID ( 需要注意的是: python中没有uuid2()这个函数). 用uuid1()或uuid4()可以获得一个唯一的ID,uuid1()包含了主机的网络名称,uuid4()不涉及网络主机名,仅生成一个随机UUID,因此从隐私保护角度uuid4()更加安全。对uuid模块中最常用的几个函数总结如下:

    2.1、uuid.uuid1([node[, clock_seq]]) : 基于时间戳

    使用主机ID, 序列号, 和当前时间来生成UUID, 可保证全球范围的唯一性. 但由于使用该方法生成的UUID中包含有主机的网络地址, 因此可能危及隐私. 该函数有两个参数, 如果 node 参数未指定, 系统将会自动调用 getnode() 函数来获取主机的硬件地址. 如果 clock_seq 参数未指定系统会使用一个随机产生的14位序列号来代替.

    2.2、uuid.uuid3(namespace, name) : 基于名字的MD5散列值

    通过计算命名空间和名字的MD5散列值来生成UUID, 可以保证同一命名空间中不同名字的唯一性和不同命名空间的唯一性, 但同一命名空间的同一名字生成的UUID相同.

    2.3、uuid.uuid4() : 基于随机数

    通过随机数来生成UUID. 使用的是伪随机数有一定的重复概率.

    2.4、uuid.uuid5(namespace, name) : 基于名字的SHA-1散列值

    通过计算命名空间和名字的SHA-1散列值来生成UUID, 算法与 uuid.uuid3() 相同.

    三、python 中uuid 方法介绍

    3.1、uuid.UUID 类

    class uuid.UUID([hex[, bytes[, bytes_le[, fields[, int[, version]]]]]]) 
    
      该类用于从参数给定的内容中实例化UUID对象(hex, bytes, bytes_le, fields, int 必须且只能指定一个):
    
      hex:指定32个字符以创建UUID对象,当指定一个32个字符构成的字符串来创建一个UUID对象时,花括号、连字符和URN前缀等都是可选的;
    
      bytes:指定一个大端字节序的总长16字节的字节串来创建UUID对象;
    
      bytes_le:指定一个小端字节序的总长16字节的字节串来创建UUID对象;
    
      fields:指定6个整数域,共计128位来创建UUID(其中,32位作为time_low段,16位作为time_mid段,16位作为time_hi_version段,8位作为clock_seq_hi_variant段,8位作为clock_seq_low段,48位作为node段);
    
      int:直接指定一个长度为128个二进制位的整数用于创建UUID对象;
    
      version:(可选)指定UUID的版本,从15,一旦指定了该参数,生成的UUID将具有自己的变体(variant)和版本数,具体请参考 RFC 4122

    3.2、uuid对象属性

    3.2.1、UUID.bytes

    以16个字节构成的字节串形式表示UUID,包含6个大端字节序的整数域;

    >>> import uuid
    >>> b = uuid.uuid3(uuid.NAMESPACE_DNS, "123")
    >>> b
    UUID('4dfc6b14-7213-3363-8009-b23c56e3a1b1')
    >>> b.bytes
    'M\xfck\x14r\x133c\x80\t\xb2<V\xe3\xa1\xb1'
    

    3.2.2、UUID.bytes_le

    以16个字节构成的字节串形式表示UUID,包含6个小端字节序的整数域;

    >>> import uuid
    >>> b = uuid.uuid3(uuid.NAMESPACE_DNS, "123")
    >>> b
    UUID('4dfc6b14-7213-3363-8009-b23c56e3a1b1')
    >>> b.bytes_le
    '\x14k\xfcM\x13rc3\x80\t\xb2<V\xe3\xa1\xb1'
    

    字节序相关:https://blog.csdn.net/damanchen/article/details/112424874

    3.2.3、UUID.fields

    以元组形式存放的UUID的6个整数域,该元组中的6个元素分别可以通过6个属性查看,还额外导出了两个属性(下面的每个域的名称也是UUID对象的一个属性):

    在这里插入图片描述

    [time-low]-[time-mide]-[time-high-and-version]-[clock-seq-and-reserved 和 clock-seq-low]-[node]
    
    time-low = 32位 unsigned integer
    time-mid = 16位 unsigned integer
    time-high-and-version = 16位 unsigned integer(时间戳高位部分与版本(Version)号混合)
    clock-seq-and-reserved = 8位 unsigned integer(时钟序列高位部分与预定义变量(Variant)混合组成)
    clock-seq-low = 8位 unsigned integer
    node = 48位 unsigned integer
    
    含义
    time_lowUUID的初始32位
    time_mid接前一域的16位
    time_hi_version接前一域的16位
    clock_seq_hi_variant接前一域的8位
    clock_seq_low接前一域的8位
    nodeUUID的最后48位
    timeUUID的总长60位的时间戳
    clock_seq14位的序列号
    >>> import uuid
    >>> b = uuid.uuid3(uuid.NAMESPACE_DNS, "123")
    >>> b
    UUID('4dfc6b14-7213-3363-8009-b23c56e3a1b1')
    >>> b.fields
    (1308388116L, 29203L, 13155L, 128L, 9L, 195972225540529L)
    

    3.2.4、UUID.hex

    以32个字符表示的UUID

    >>> import uuid
    >>> b = uuid.uuid3(uuid.NAMESPACE_DNS, "123")
    >>> b
    UUID('4dfc6b14-7213-3363-8009-b23c56e3a1b1')
    >>> b.hex
    '4dfc6b14721333638009b23c56e3a1b1'
    
    

    3.2.5、UUID.int

    以一个长度为128个二进制位的整数表示的UUID;

    >>> import uuid
    >>> b = uuid.uuid3(uuid.NAMESPACE_DNS, "123")
    >>> b
    UUID('4dfc6b14-7213-3363-8009-b23c56e3a1b1')
    >>> b.int
    103661186321484643176355349665283285425L
    

    3.2.6、UUID.urn

    RFC 4122 中指定的URN形式表示的UUID

    >>> import uuid
    >>> b = uuid.uuid3(uuid.NAMESPACE_DNS, "123")
    >>> b
    UUID('4dfc6b14-7213-3363-8009-b23c56e3a1b1')
    >>> b.urn
    'urn:uuid:4dfc6b14-7213-3363-8009-b23c56e3a1b1'
    

    3.2.7、UUID.variant

    UUID变体(variant),决定UUID内部的布局,已有的值为 RESERVED_NCS、``RFC_4122、``RESERVED_MICROSOFT RESERVED_FUTURE

    变量(variant), 或称做类型, 4 bytes, 包括以下4种(其中X为任意值):

    0XX NCS兼容预留
    10X RFC4122采用
    110 微软兼容预留
    111 还未定义, 留作以后它用
    
    >>> import uuid
    >>> b = uuid.uuid3(uuid.NAMESPACE_DNS, "123")
    >>> b
    UUID('4dfc6b14-7213-3363-8009-b23c56e3a1b1')
    >>> b.variant
    'specified in RFC 4122'
    

    3.2.8、UUID.version

    UUID版本,只有当变体为 RFC_4122 时才有效。

    0001 时间的版本
    0010 DCE Security
    0011 MD5哈希
    0100 ()随机数
    0101 SHA-1哈希
    
    >>> import uuid
    >>> b = uuid.uuid3(uuid.NAMESPACE_DNS, "123")
    >>> b
    UUID('4dfc6b14-7213-3363-8009-b23c56e3a1b1')
    >>> b.version
    3
    

    3.2.9、uuid.getnode()

    获取硬件的地址并以48位二进制长度的正整数形式返回,这里所说的硬件地址是指网络接口的MAC地址,如果一个机器有多个网络接口,可能返回其中的任一个。如果获取失败,将按照RFC 4122的规定将随机返回的48位二进制整数的第8位设置成1。

    >>> import uuid
    >>> b1 = uuid.getnode()
    >>> b1
    190070690681122
    

    3.2.10、uuid.uuid1([node[, clock_seq]])

    利用主机ID、序列号和当前时间生成一个UUID,如果参数 node 没有给定,会调用 getnode() 来获取硬件地址。如果参数中指定了 clock_seq ,使用参数中给定的时钟序列作为序列号,否则使用一个随机的14位长的序列号。

    >>> import uuid
    >>> b2 = uuid.uuid1()
    >>> b2
    UUID('326ee180-cf44-11ec-af81-acde48001122')
    >>> b3 = uuid.uuid1(190070690681122)
    >>> b3
    UUID('f059ef8a-cf44-11ec-a1cd-acde48001122')
    
    

    3.2.11、uuid.uuid3(namespace, name)

    基于命名空间标识符(实质上是一个UUID)和一个名称(实质上是一个字符串)的MD5哈希值生成UUID。

    >>> import uuid
    >>> b = uuid.uuid3(uuid.NAMESPACE_DNS, "123")
    >>> b
    UUID('4dfc6b14-7213-3363-8009-b23c56e3a1b1')
    

    3.2.12、uuid.uuid4()

    生成一个随机的UUID

    >>> import uuid
    >>> c = uuid.uuid4()
    >>> c
    UUID('a46e5f4c-5945-496c-80d5-6a72ac11523b')
    

    3.2.13、uuid.uuid5(namespace, name)

    基于命名空间标识符(实质上是一个UUID)和一个名称(实质上是一个字符串)的SHA-1哈希值生成UUID

    >>> import uuid
    >>> d = uuid.uuid5(uuid.NAMESPACE_DNS, "123")
    >>> d
    UUID('37813542-0dca-5a8a-b2a2-b69c2d45583f')
    

    3.2.14、uuid3()和uuid5()中提到的命名空间标识符,uuid模块定义了如下的备选项

    uuid.NAMESPACE_DNS 
      当指定该命名空间时,参数 name 是一个完全限定的(fully-qualified)域名
      
    uuid.NAMESPACE_URL 
      当指定该命名空间时,参数 name 是一个URL
      
    uuid.NAMESPACE_OID 
      当指定该命名空间时,参数 name 是一个ISO OID
       
     uuid.NAMESPACE_X500 
    		当指定该命名空间时,参数 name 是一个DER格式或文本格式的X.500 DN。
    

    3.2.15、关于属性variant,uuid模块定义了如下的常量

    uuid.RESERVED_NCS

    该常量为兼容NCS而保留;0XX NCS兼容预留

    >>> import uuid
    >>> d1 = uuid.RESERVED_NCS
    >>> d1
    'reserved for NCS compatibility'
    

    uuid.RFC_4122

    按照 RFC 4122 的规定来确定UUID的布局;10X RFC4122采用

    >>> import uuid
    >>> d2 = uuid.RFC_4122 
    >>> d2
    'specified in RFC 4122'
    

    uuid.RESERVED_MICROSOFT

    该常量位兼容微软而保留;110 微软兼容预留

    >>> import uuid
    >>> d3 = uuid.RESERVED_MICROSOFT
    >>> d3
    'reserved for Microsoft compatibility'
    

    uuid.RESERVED_FUTURE

    该常量为未来可能的定义保留,111 还未定义, 留作以后它用

    >>> import uuid
    >>> d4 = uuid.RESERVED_FUTURE 
    >>> d4
    'reserved for future definition'
    

    3.2.16、时间戳(timestamp), 60bit:

    版本1: 时间戳采用UTC时间,以100ns为间隔,重1582年10月15日00:00:00.00开始计算

    3.2.17、时钟序列, 14bit:

    版本1: 用来防止在时间回调的情况下,导致的UUID重复问题
    如果有时间回调(可能有系统断电导致),如果生成器在回调时间之后有生成新的UUID,那么时钟序列应该改变, 如果新生成的UUID时钟序列可知,那么时钟序列递增即可; 若不可知, 那么时钟序列应重置到一个47位随机数,或一个47位高质量的伪随机数,并且第48位设置为1,用来区别真正的MAC地址(由于所有MAC地址在网卡中第48为0)

    3.2.18、节点(node), 48bit:

    版本1: 为主机MAC地址, 若主机有多个MAC地址,随机选其中一个, 若系统没有MAC地址, 则采用(伪)随机数.

    四、使用示例

    4.1、根据系统时间和MAC地址创建UUID

    import uuid
    
    # 使用uuid1创建随机id
    UID = uuid.uuid1()
    
    # 打印标准ID
    print ("标准值: ", UID)
    
    # 打印字节ID
    print ("字节ID: ", repr(UID.bytes))
    
    # 打印整数ID
    print ("整数值: ", UID.int)
    
    # Print the hex ID
    print ("十六进制值: ", UID.hex)
    
    # 打印版本号
    print ("版本号为 :", UID.version)
    
    # 打印字段值
    print ("字段是 ", UID.fields)
    
    # 以十六进制打印MAC值
    print ("节点值为: ", hex(UID.node))
    
    # 打印时间值
    print ("时间值为: ", UID.time)
    
    
    
    # 结果如下
    ('\xe6\xa0\x87\xe5\x87\x86\xe5\x80\xbc: ', UUID('ce96a4ab-cf47-11ec-9f71-acde48001122'))
    ('\xe5\xad\x97\xe8\x8a\x82ID: ', '\'\\xce\\x96\\xa4\\xab\\xcfG\\x11\\xec\\x9fq\\xac\\xdeH\\x00\\x11"\'')
    ('\xe6\x95\xb4\xe6\x95\xb0\xe5\x80\xbc: ', 274603151587812998186977116984306569506L)
    ('\xe5\x8d\x81\xe5\x85\xad\xe8\xbf\x9b\xe5\x88\xb6\xe5\x80\xbc: ', 'ce96a4abcf4711ec9f71acde48001122')
    ('\xe7\x89\x88\xe6\x9c\xac\xe5\x8f\xb7\xe4\xb8\xba :', 1)
    ('\xe5\xad\x97\xe6\xae\xb5\xe6\x98\xaf ', (3465979051L, 53063L, 4588L, 159L, 113L, 190070690681122L))
    ('\xe8\x8a\x82\xe7\x82\xb9\xe5\x80\xbc\xe4\xb8\xba: ', '0xacde48001122L')
    ('\xe6\x97\xb6\xe9\x97\xb4\xe5\x80\xbc\xe4\xb8\xba: ', 138713595857249451L)
    

    4.2、使用uuid3和uuid5生成主机名的SHA-1和MD5值

    import uuid
    
    # 定义三个主机名的元组
    hosts = ('www.linuxmi.com', 'www.google.com', 'www.kotlin.ai')
    
    # 使用loop迭代元组的值
    for hostname in hosts:
        # 打印主机名
        print("主机名: ", hostname)
        # 使用uuid5获得SHA- 1值
        print('tSHA-1值 :', uuid.uuid5(uuid.NAMESPACE_DNS, hostname))
        # 使用uuid3获取MD5值
        print('tMD5值 :', uuid.uuid3(uuid.NAMESPACE_DNS, hostname))
        
        
        
    # 结果如下
    ('\xe4\xb8\xbb\xe6\x9c\xba\xe5\x90\x8d: ', 'www.linuxmi.com')
    ('tSHA-1\xe5\x80\xbc :', UUID('2e7f9640-0358-54bb-ac54-10274483cc0f'))
    ('tMD5\xe5\x80\xbc :', UUID('008f758f-b1e7-367b-b3ca-6fb529777928'))
    ('\xe4\xb8\xbb\xe6\x9c\xba\xe5\x90\x8d: ', 'www.google.com')
    ('tSHA-1\xe5\x80\xbc :', UUID('488416f4-fcaf-5027-8c63-0105cfa213ea'))
    ('tMD5\xe5\x80\xbc :', UUID('de87628d-5377-3ba7-b31b-cde1cc8d423f'))
    ('\xe4\xb8\xbb\xe6\x9c\xba\xe5\x90\x8d: ', 'www.kotlin.ai')
    ('tSHA-1\xe5\x80\xbc :', UUID('d670314f-80be-5863-ba31-9b46be9fa355'))
    ('tMD5\xe5\x80\xbc :', UUID('ee11a1b9-3ce6-39b7-b311-cded3c178ba5'))
    

    4.3、使用uuid4创建随机数

    import uuid
    
    i = 1
    
    # 循环五次
    while i < 6:
        # 产生一个随机数
        print("No-", i, ' ', uuid.uuid4)
        # 将值增加一 
        i = i + 1
        
        
    # 结果如下
    ('No-', 1, ' ', <function uuid4 at 0x105050c50>)
    ('No-', 2, ' ', <function uuid4 at 0x105050c50>)
    ('No-', 3, ' ', <function uuid4 at 0x105050c50>)
    ('No-', 4, ' ', <function uuid4 at 0x105050c50>)
    ('No-', 5, ' ', <function uuid4 at 0x105050c50>)
    

    4.4、使用UUID对象从列表中创建排序的UUID

    import uuid
    
    # 创建一个有效格式的id list
    list_Ids = [
    
        'a4f8dd97-c8be-345b-239e-8a68e6abf800',
    
        '673a5eaa-56c6-aaaa-bc45-4536cd9067ac',
    
        'dcbbaa88-5bf1-11dd-ab48-990ab200d674',
    
        '4567aabb-89ad-77ab-67ad-aaaccdd904ae'
    
    ]
    
    # 使用loop打印列表值
    print('nlist的值:')
    for val in list_Ids:
        print (val)
    # list的值将被转换为uuid并进行排序
    try:
        uuids = [uuid.UUID(s) for s in list_Ids]
        uuids.sort
        print('n已排序uuid的值:')
        for val in uuids:
            print (val)
    except ValueError:
        # 如果list的任何值的格式无效,则打印错误消息
        print('格式不正确的十六进制UUID字符串')
        
        
        
    # 结果如下
    nlist的值:
    a4f8dd97-c8be-345b-239e-8a68e6abf800
    673a5eaa-56c6-aaaa-bc45-4536cd9067ac
    dcbbaa88-5bf1-11dd-ab48-990ab200d674
    4567aabb-89ad-77ab-67ad-aaaccdd904ae
    n已排序uuid的值:
    a4f8dd97-c8be-345b-239e-8a68e6abf800
    673a5eaa-56c6-aaaa-bc45-4536cd9067ac
    dcbbaa88-5bf1-11dd-ab48-990ab200d674
    4567aabb-89ad-77ab-67ad-aaaccdd904ae
    

    五、参考文档

    1、https://blog.csdn.net/catwan/article/details/84998986

    2、https://www.cnblogs.com/Security-Darren/p/4252868.html

    3、https://baike.baidu.com/item/RFC/1840?fr=aladdin

    4、https://www.sohu.com/a/400851011_495675

    5、https://segmentfault.com/a/1190000000484508

    6、https://blog.csdn.net/weixin_44621343/article/details/115958618

    展开全文
  • 关于UUID

    2021-11-24 00:24:16
    UUID(Universally Unique Identifier,通用唯一识别码),由32位16进制数字构成,二进制共128位。 其目的是让分布式系统中的所有元素都能有唯一的识别信息。如此一来,每个人都可以创建不与其它人冲突的 UUID。 组成 ...

    文章目录

    介绍

    UUID(Universally Unique Identifier,通用唯一识别码),由32位16进制数字构成,二进制共128位

    其目的是让分布式系统中的所有元素都能有唯一的识别信息。如此一来,每个人都可以创建不与其它人冲突的 UUID。

    组成

    UUID共有5部分组成:xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx,表现形式为8-4-4-4-12的32个字符。

    如:df623885-68f9-47e0-b13c-bbd9600b6e71

    • 16进制数字M表示UUID版本,当前有5个版本:1,2,3,4,5。这5个版本使用不同算法,利用不同的信息产生UUID,各版本有各自优势,适用于不同情景。具体使用的信息:
    1. version 1, date-time & MAC address,当前时间戳 + MAC地址信息 生成
      1. 机器的MAC地址出厂后不能保证完全唯一,且之后 MAC 地址也可手动修改;
      2. MAC 地址的暴露会造成了隐私与安全问题;
      3. 若一台机子上的两个进程同时跑,有可能出现重复问题。
    2. version 2, date-time & group/user id
    3. version 3, MD5 hash & namespace
    4. version 4, pseudo-random number,伪随机数信息 生成,最频繁使用
    5. version 5, SHA-1 hash & namespace
    • 16进制数字N的二进制位一至四个最高有效位表示UUID变体(variant),有固定的两位10xx因此只可能取值8, 9, a, b
    • 因为时间戳和随机数的唯一性,版本1和版本4总是生成唯一的标识符。若希望对给定的一个字符串总是能生成相同的 UUID,使用版本3或版本5。

    Java实现

    java.util.UUID封装了UUID的实现,来看看其中方法:

    /**
     * Static factory to retrieve a type 4 (pseudo randomly generated) UUID.
     *
     * 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);
    }
    

    可以从randomUUID()看到,这个UUID应该是基于随机数的,版本4的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);
    }
    

    可以从nameUUIDFromBytes(byte[] name)看到,这个UUID应该是基于MD5和命名空间,版本3的UUID。对于给定的字符串(name)总能生成相同的UUID。



    参考:

    什么是 UUID ?

    UUID 的五个版本

    展开全文
  • UUID

    千次阅读 2018-01-16 16:08:30
    1. 背景知识: UUID: 通用唯一标识符 ( Universally Unique Identifier )

    1. 背景知识:

      UUID: 通用唯一标识符 ( Universally Unique Identifier ), 对于所有的UUID它可以保证在空间和时间上的唯一性. 它是通过MAC地址, 时间戳, 命名空间, 随机数, 伪随机数来保证生成ID的唯一性, 有着固定的大小( 128 bit ). 它的唯一性和一致性特点使得可以无需注册过程就能够产生一个新的UUID. UUID可以被用作多种用途, 既可以用来短时间内标记一个对象, 也可以可靠的辨别网络中的持久性对象.

      为什么要使用UUID?

      很多应用场景需要一个id, 但是又不要求这个id 有具体的意义, 仅仅用来标识一个对象. 常见的例子有数据库表的id 字段. 另一个例子是前端的各种UI库, 因为它们通常需要动态创建各种UI元素, 这些元素需要唯一的id , 这时候就需要使用UUID了.

    2. Python的uuid模块

      python的uuid模块提供UUID类和函数uuid1(), uuid3(), uuid4(), uuid5() 来生成1, 3, 4, 5各个版本的UUID ( 需要注意的是: python中没有uuid2()这个函数). 对uuid模块中最常用的几个函数总结如下:
      1.uuid.uuid1([node[, clock_seq]]): 基于时间戳
      使用主机ID, 序列号, 和当前时间来生成UUID, 可保证全球范围的唯一性. 但由于使用该方法生成的UUID中包含有主机的网络地址, 因此可能危及隐私. 该函数有两个参数, 如果 node 参数未指定, 系统将会自动调用 getnode() 函数来获取主机的硬件地址. 如果 clock_seq 参数未指定系统会使用一个随机产生的14位序列号来代替.
      
      2. uuid.uuid3(namespace, name) : 基于名字的MD5散列值

      通过计算命名空间和名字的MD5散列值来生成UUID, 可以保证同一命名空间中不同名字的唯一性和不同命名空间的唯一性, 但同一命名空间的同一名字生成的UUID相同.

      4. uuid.uuid4() : 基于随机数

      通过随机数来生成UUID. 使用的是伪随机数有一定的重复概率.

      5. uuid.uuid5(namespace, name) : 基于名字的SHA-1散列值

      通过计算命名空间和名字的SHA-1散列值来生成UUID, 算法与 uuid.uuid3() 相同.

    3. uuid模块的典型使用方法:

    >>> import uuid
    
    >>> # make a UUID based on the host ID and current time
    >>> uuid.uuid1()
    UUID('a8098c1a-f86e-11da-bd1a-00112444be1e')
    
    >>> # make a UUID using an MD5 hash of a namespace UUID and a name
    >>> uuid.uuid3(uuid.NAMESPACE_DNS, 'python.org')
    UUID('6fa459ea-ee8a-3ca4-894e-db77e160355e')
    
    >>> # make a random UUID
    >>> uuid.uuid4()
    UUID('16fd2706-8baf-433b-82eb-8c7fada847da')
    
    >>> # make a UUID using a SHA-1 hash of a namespace UUID and a name
    >>> uuid.uuid5(uuid.NAMESPACE_DNS, 'python.org')
    UUID('886313e1-3b8a-5372-9b90-0c9aee199e5d')
    
    >>> # make a UUID from a string of hex digits (braces and hyphens ignored)
    >>> x = uuid.UUID('{00010203-0405-0607-0809-0a0b0c0d0e0f}')
    
    >>> # convert a UUID to a string of hex digits in standard form
    >>> str(x)
    '00010203-0405-0607-0809-0a0b0c0d0e0f'
    
    >>> # get the raw 16 bytes of the UUID
    >>> x.bytes
    '\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f'
    
    >>> # make a UUID from a 16-byte string
    >>> uuid.UUID(bytes=x.bytes)
    UUID('00010203-0405-0607-0809-0a0b0c0d0e0f')

    参考资料:

    Python_uuid模块参考手册 : https://docs.python.org/2/library/uuid.html

    UUID算法 : http://www.ietf.org/rfc/rfc4122.txt

    原文作者:会心一击
    出处:http://www.cnblogs.com/lijingchn/

    展开全文
  • uuid定义:UUID是由一组32位数的16进制数字所构成,是故UUID理论上的总数为1632=2128,约等于3.4 x 1038。也就是说若每纳秒产生1兆个UUID,要花100亿年才会将所有UUID用完。UUID的标准型式包含32个16进制数字,以连...
  • UUID使用简介

    千次阅读 2020-12-02 10:53:12
    1.UUID 简介 2.UUID 组成 3.项目实战 1.UUID 简介 UUID 含义是通用唯一识别码 (Universally Unique Identifier),这是一个软件建构的标准。 也是被开源软件基金会 (Open Software Foundation, OSF)的组织应用...
  • uuid

    2019-12-08 18:55:07
    PYTHON中的UUID简介 一. 什么是UUID:  UUID: 通用唯一标识符 ( Universally Unique Identifier ), 对于所有的UUID它可以保证在空间和时间上的唯一性. 它是通过MAC地址, 时间戳, 命名空间, 随机数, 伪随机数来保证...
  • python uuid使用方法以及详解

    千次阅读 2021-02-09 07:43:05
    1.背景知识:UUID: 通用唯一标识符 ( Universally Unique Identifier ), 对于所有的UUID它可以保证在空间和时间上的唯一性. 它是通过MAC地址, 时间戳, 命名空间, 随机数, 伪随机数来保证生成ID的唯一性,有着固定的...
  • Android UUID.randomUUID()方法介绍

    千次阅读 2021-06-11 13:29:02
    UUID.randomUUID().toString()是javaJDK提供的一个自动生成主键的方法。 UUID(Universally Unique Identifier)全局唯一标识符,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的,是由一个...
  • python uuid.uuid4

    万次阅读 2018-12-14 10:27:41
    Python_uuid 学习总结   1. 背景知识:    UUID: 通用唯一标识符 ( Universally Unique Identifier ), 对于所有的UUID它可以保证在空间和时间上的唯一性. 它是通过MAC地址, 时间戳, 命名空间, 随机数, 伪随机...
  • SNUUIDIOS equipment identification, which still exists to delete the app.IOS UUID./******* 以下是中文 *******/苹果公司为保护用户隐私权,ios6之后无法获取设备的udid,而采用uuid,然而每次uuid都不同。...
  • python uuid 介绍

    2021-02-09 07:43:05
    1. 背景知识:UUID: 通用唯一标识符 ( Universally Unique Identifier ), 对于所有的UUID它可以保证在空间和时间上的唯一性. 它是通过MAC地址, 时间戳, 命名空间, 随机数, 伪随机数来保证生成ID的唯一性,有着固定的...
  • 蓝牙 16 位通用唯一标识符 (UUID)

    千次阅读 2022-03-20 01:56:02
    16 位的通用唯一标识符 (UUID)分类 分配类型 分配UUID段 作用 GATT Service 0x1800 ~ 0x26FF 服务类型,用来识别具体是哪个服务。 GATT Unit 0x2700 ~ 0x27FF 计量单位,如:km/h, kg。 GATT ...
  • } 使用keychain保存UUID 有了上面的方法,接下来就操作就很简单了:/** 先从keychain里面加载uuid 如果没有 就获取uuid并加载到keychain中 */+ (NSString *)getUUIDfromKeychain { NSString * uuid = NULL...
  • python uuid

    千次阅读 2021-02-26 13:36:57
    python uuid 1. 背景知识:  UUID: 通用唯一标识符 ( Universally Unique Identifier ), 对于所有的UUID它可以保证在空间和时间上的唯一性. 它是通过MAC地址, 时间戳, 命名空间, 随机数, 伪随机数来保证生成ID的...
  • BLE蓝牙的UUID列表

    千次阅读 多人点赞 2019-12-10 14:36:34
    BLE蓝牙的UUID列表,从官网摘录并翻译
  • 在iOS设备上,设备->隐私->广告页面上有一个设置项: 限制广告跟踪. 默认未选中,即关闭状态,没有限制. 用户可以选择限制广告跟踪. 除了设置外,还有一个按钮: 恢复广告标识符...如果用户单击此按钮,则IDFA值将...
  • C++中Boost生成UUID的实例?

    千次阅读 2022-03-12 20:56:03
    我研究了Boost UUID,但我无法设法生成UUID,因为我不明白要使用哪个类和方法。 写回答关注邀请回答分享提问于 2018-04-17 2 个回答 热门排序 用户回答回答于 2018-04-17 一个基本的例子: #include <boost/uuid/...
  • 源代码: Lib/uuid.py 这个模块提供了不可变的UUID对象(UUID类...注意,uuid1()可能会损害隐私,因为它创建了一个包含计算机网络地址的UUIDuuid4()创建一个随机的UUID。 class uuid.UUID(hex=None, bytes=None..
  • uuid除了表达硬件的唯一标识,还能用来标识软件的标识,比如手机上不同的app的UUID是互斥的。然而随着Android版本的升级,获取设备ID却越来越难了。IMEI本该最理想的设备ID,具备唯一性,恢复出厂设置不会变化...
  • UUID详解

    万次阅读 2017-05-18 09:55:53
    UUID含义是通用唯一识别码 (Universally Unique Identifier),这 是一个软件建构的标准,也是被开源软件基金会 (Open Software Foundation, OSF) 的组织在分布式计算环境 (Distributed Computing Environment, ...
  • 最后发现是UUID的问题,UUID作为主键在数据进行插入的时候对于系统的压力是非常大的。 UUID(Universally Unique Identifier)介绍 UUID结构如上图所示,比如7bf13c38-00a1-484e-b1e2-80c1ab8e754c,作为...
  • 1 uuid是什么 UUID: 通用唯一标识符 ( Universally Unique Identifier ), 对于所有的UUID它可以保证在空间和时间上的唯一性. 它是通过MAC地址, 时间戳, 命名空间, 随机数, 伪随机数来保证生成ID的唯一性,有着固定...
  • python基础:4种uuid详解

    千次阅读 2020-12-21 15:19:52
    1、 uuid是什么? 2、uuid的组成 3、uuid的分类 3.1 uuid1 3.2 uuid4 3.3uuid3、uuid5 1、 uuid是什么? UUID stands forUniversally Unique IDentifier. It's a 128-bit value used fora unique ...
  • Python_uuid 学习总结

    2020-05-18 10:07:57
    uuid.uuid1([node[, clock_seq]]) : 基于时间戳2.2. uuid.uuid3(namespace, name) : 基于名字的MD5散列值2.4. uuid.uuid4() : 基于随机数2.5. uuid.uuid5(namespace, name) : 基于名字的SHA-1散列值 1. 背景知识 ...
  • BLE蓝牙获取手机端唯一码(UUID)

    千次阅读 2022-02-26 11:31:02
    探讨BLE蓝牙芯片如何获取手机端唯一码(UUID
  • android 获取UUid

    千次阅读 2016-12-19 18:03:22
    获取UUID
  • 但由于使用该方法生成的UUID中包含有主机的网络地址, 因此可能危及隐私. # 该函数有两个参数, 如果 node 参数未指定, 系统将会自动调用 getnode() 函数来获取主机的硬件地址. # 如果 clock_seq 参数未指定系统会...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,014
精华内容 1,205
热门标签
关键字:

uuid隐私