12.8 uuid:全局唯一标识符
uuid模块实现了RFC 4122中描述的全局唯一标识符(Universally Unique Identifier):这个RFC定义了一个系统,可以为资源创建唯一的标识符,这里采用一种不需要集中注册机的方式。UUID值为128位。正如参考指南所述,“UUID可以保证跨空间和时间的唯一性”。对于文档、主机、应用客户以及其他需要唯一值的情况,UUID可以用来生成标识符。这个RFC特别强调创建一个统一资源名(Uniform Resource Name)命名空间,并且涵盖了3个主要算法。
使用IEEE 802 MAC 地址作为唯一性来源
使用伪随机数
使用公开的串并结合密码散列
在上述所有情况下,种子值都要与系统时钟结合,如果向后设置时钟,则要用一个时钟序列值维护唯一性。
12.8.1 UUID 1: IEEE 802 MAC地址
UUID 1值使用主机的MAC地址计算。uuid模块使用getnode()来获取当前系统的MAC值。
import uuid
print(hex(uuid.getnode()))
如果一个系统有多个网卡,那么响应地便会有多个MAC地址,并且可能返回其中任意一个值。
运行结果:
要为一个主机(由其MAC地址标识)生成一个UUID,需要使用uuid1()函数。节点标识符参数是可选的;如果没有设置这个域,那么便会使用getnode()返回的值。
import uuid
u = uuid.uuid1()
print(u)
print(type(u))
print('byetes :',repr(u.bytes))
print('hex :',u.hex)
print('int :',u.int)
print('urn :',u.urn)
print('variant :',u.variant)
print('version :',u.version)
print('fields :',u.fields)
print(' time_low : ',u.time_low)
print(' time_mid : ',u.time_mid)
print(' time_hi_version : ',u.time_hi_version)
print(' clock_seq_hi_variant: ',u.clock_seq_hi_variant)
print(' clock_seq_low : ',u.clock_seq_low)
print(' node : ',u.node)
print(' time : ',u.time)
print(' clock_seq : ',u.clock_seq)
对于返回的UUID对象,可以通过只读的实例属性访问它的各个部分。有些属性是UUID值的不同表示,如hex,int和urn。
运行结果:
由于有时间分量(time),所以每次调用uuid1()都会返回一个新值。
import uuid
for i in range(3):
print(uuid.uuid1())
在这个输出中,只有时间分量(串的开始部分)有变化。
运行结果:
由于每个计算机有不同的MAC地址,所以在不同系统上运行这个示例程序会生成完全不同的值。下一个例子传递不同节点ID来模拟在不同主机上运行。
import uuid
for node in [0x1ec200d9e0,0x1e5274040e]:
print(uuid.uuid1(node),hex(node))
除了返回不同的时间值,UUID末尾的节点标识符也有变化。
运行结果: