概述
UUID 是通用唯一识别码(Universally Unique Identifier)的缩写,是一种软件建构的标准,亦为开放软件基金会组织在分布式计算环境领域的一部分。
UUID是一个128比特的数值,这个数值可以通过一定的算法计算出来。UUID用来识别属性类型,在所有空间和时间上被视为唯一的标识。一般来说,可以保证这个值是真正唯一的任何地方产生的任意一个UUID都不会有相同的值。使用UUID的一个好处是可以为新的服务创建新的标识符。这样一来,客户端在查找一个服务时,只需要在它的服务查找请求中指出与某类服务(或某个特定服务)有关的UUID,如果服务的提供者能将可用的服务与这个UUID相匹配,就返回一个响应。
组成
UUID由以下几部分的组合:
(1)基于时间戳,当前日期和时间,UUID的第一个部分与时间有关。
(2)时钟序列。
(3)全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得。
UUID是一个128比特的数值,使用16进制表示,就是一个32个16进制数组成的字符串(标准的分配格式是8-4-4-4-12,如'b85fa97e-ad39-11eb-9b9a-acde48001122'
)。
uuid的标准有uuid1
,uuid2
, uuid3
, uuid4
,uuid5
这五个版本,python中支持除uuid2
以外的其他版本。
python中使用
Python 内置了uuid库,通过import uuid
导入,提供了uuid1
,uuid3
, uuid4
, uuid5
对应的同名函数供使用,函数的返回值类型是UUID
。
uuid1(node, clock_seq)
:
使用的变量因子是 时间戳+时钟序列+节点信息(Mac地址),最后的12个字符对应的就是MAC地址,因为是MAC地址,同一台机器上产生的uuid1的后12个字符完全一致,但是生成后暴露了MAC地址这就很不好了。node参数用来设置最后12个字符(48个二进制位)的值(传递的是十进制会自动进行转换)。
uuid3(namespace, name)
:
需要传递命名空间和自定义字符串生成UUID,使用MD5哈希产生。
uuid4()
:
基于随机数产生,极小概率产生重复。
uuid5(namespace, name)
:
和uuid3用法相同,但是使用SHA-1哈希生成UUID。由于SHA-1产生的数据大小为20个字节,而uuid只需要16个字节,所以uuid在使用的时候,只截取了SHA-1产生的前16个字节。
uuid库提供了namespace的可选项如下,可直接通过 uuid.NAMESPACE_DNS
调用:
1 | NAMESPACE_DNS = UUID('6ba7b810-9dad-11d1-80b4-00c04fd430c8') |
使用uuid3以及uuid5得到的uuid唯一且可复现,使用同样的
namespace
以及name
可以得到同样的值,因为uuid3和uuid5使用的分别是MD5和SHA-1来产生的,传递的key一样,所以得到的uuid值不变。
uuid版本的选择可以根据实际情况进行选择。
此外UUID类还提供了属性方法,用于得到相应格式的uuid:
uuid_obj.bytes 得到16字节的字符串
uuid_obj.fields 得到元组类型
uuid_obje.hex UUID为32个字符的十六进制字符串,就是去除'-'的uuid。
uuid_obj.int 得到对应的十进制数。
通过uuid_obj.version 查看uuid的版本。
使用str(uuid_obje)可以得到对应的字符串形式,UUID类内部手动实现了'__str__'。
1 | import uuid |