0%

UUID的python实现

概述

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, uuid4uuid5这五个版本,python中支持除uuid2以外的其他版本。

python中使用

Python 内置了uuid库,通过import uuid 导入,提供了uuid1uuid3uuid4uuid5 对应的同名函数供使用,函数的返回值类型是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
2
3
4
NAMESPACE_DNS = UUID('6ba7b810-9dad-11d1-80b4-00c04fd430c8')
NAMESPACE_URL = UUID('6ba7b811-9dad-11d1-80b4-00c04fd430c8')
NAMESPACE_OID = UUID('6ba7b812-9dad-11d1-80b4-00c04fd430c8')
NAMESPACE_X500 = UUID('6ba7b814-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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import uuid

uuid3 = uuid.uuid3(namespace=uuid.NAMESPACE_URL, name='hello')
print(uuid3)
print(type(uuid3))
print(uuid3.hex)
print(type(uuid3.hex))
print(uuid3.bytes)
print(type(uuid3.bytes))

"""
cf3741de-a2dd-36f7-a791-8736e42c4c2f
<class 'uuid.UUID'>
cf3741dea2dd36f7a7918736e42c4c2f
<class 'str'>
b'\xcf7A\xde\xa2\xdd6\xf7\xa7\x91\x876\xe4,L/'
<class 'bytes'>
"""