什么是python中函数唯⼀标识符_Python3标准库:uuid全局唯
⼀标识符
1. uuid 全局唯⼀标识符
uuid 模块实现了全局唯⼀标识符(Universally Unique Identifier);这个RFC定义了⼀个系统,可以为资源创建唯⼀的标识符,这⾥采⽤⼀种不需要集中注册机的⽅式。UUID值为128位,正如参考指南所述,“UUID可以保证跨空间和时间的唯⼀性”。对于⽂档、主机、应⽤客户以及其他需要唯⼀值的情况,UUID可以⽤来⽣成标识符。这个RFC特别强调创建⼀个统⼀资源名(Uniform Resource Name)命名空间,并且涵盖了3个主要算法。
使⽤IEEE802MAC地址作为唯⼀性来源
使⽤伪随机数
使⽤公开的串并结合密码散列
在上述所有情况下,种⼦值都要与系统时钟结合,如果向后设置时钟,则要⽤⼀个时钟序列值维护唯⼀性。
1.1 UUID1: IEEE 802 MAC地址
UUID1值使⽤主机的MAC地址计算。uuid模块使⽤getnode()来获取当前系统的MAC值。
importuuidprint(de()))
如果⼀个系统有多个⽹卡,那么相应地便会有多个MAC地址,并且可能返回其中任意⼀个值。
要为⼀个主机(由其MAC地址标识)⽣成⼀个UUID,需要使⽤uuid1()函数。节点标识符参数是可选的;如果没有设置这个域,那么便会使⽤getnode()返回的值。
importuuid
u=uuid.uuid1()print(u)print(type(u))print('bytes :', 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()都会返回⼀个新值。
importuuidfor i in range(3):print(uuid.uuid1())
在这个输出中,只有时间分量(串的开始部分)有变化。
由于每个计算机有不同的MAC地址,所以在不同系统上运⾏这个⽰例程序会⽣成完全不同的值。下⼀个例⼦传递不同的节点ID来模拟在不同主机上运⾏。
importuuidfor node in [0x1ec200d9e0, 0x1e5274040e]:print(uuid.uuid1(node), hex(node))
除了返回不同的时间值,UUID末尾的节点标识符也有变化。
1.2 UUID 3和5 基于名字的值
有些情况下可能需要根据名字创建UUID值,⽽不是根据随机值或基于时间的值来创建。UUID3和5规范使⽤密码散列值(分别使⽤MD5或SHA-1),将特定于命名空间的种⼦值与名字相结合。有⼀些由预定义UUID值标识的公开的命名空间,分别⽤于处理DNS、URL、ISO OID和X.500识别名(Distinguished Name)。通过⽣成和保存UUID值,还可以定义新的特定于应⽤的命名空间。
importuuid
hostnames= ['www.doughellmann', 'blog.doughellmann']for name inhostnames:print(name)print('MD5 :',
uuid.uuid3(uuid.NAMESPACE_DNS, name))print('SHA-1 :', uuid.uuid5(uuid.NAMESPACE_DNS, name))print()
要从⼀个DNS名创建UUID,可以把uuid.NAMESPACE_DNS作为命名空间参数传⼊uuid3()或uuid5()。
不论什么时间计算或者在哪⾥计算,⼀个命名空间中给定名的UUID值总是相同的。
importuuid
namespace_types=sorted(
types是什么意思nfor n indir(uuid)if n.startswith('NAMESPACE_')
)
name= 'www.doughellmann'
for namespace_type innamespace_types:print(namespace_type)
namespace_uuid=getattr(uuid, namespace_type)print(' ', uuid.uuid3(namespace_uuid, name))print(' ',
uuid.uuid3(namespace_uuid, name))print()
但是命名空间中相同名字的UUID值则是不同的。
1.3 UUID 4 随机数
有时,基于主机和基于命名空间的UUID值“差别还不够⼤”。例如,如果UUID要作为散列键,则需要有区分度更⼤、更随机的值序列来避免散列表中出现冲突。让值有更少的共同数字也能更容易地在⽇志⽂件中查这些值。为了增加UUID的区分度,可以使⽤uuid4()利⽤随机的输⼊值⽣成UUID。
importuuidfor i in range(3):print(uuid.uuid4())
随机性的来源取决于导⼊uuid时哪些C库可⽤。如果可以加载libuuid(或uuid.d11),⽽且其中包含⼀个⽣成随机值的函数,那么便使⽤这个函数。否则,使⽤os.urandom()或random模块。
1.4 处理UUID对象
除了⽣成新的UUID值,还可以解析标准格式的串以创建UUID对象,使⽐较和排序操作的处理更为容易。
importuuiddefshow(msg, l):print(msg)for v inl:print(' ', v)print()
input_values=['urn:uuid:f2f84497-b3bf-493a-bba9-7c68e6def80b','{417a5ebb-01f7-4ed5-aeac-
3d56cd5037b0}','2115773a-5bf1-11dd-ab48-001ec200d9e0',
]
show('input_values', input_values)
uuids= [uuid.UUID(s) for s ininput_values]
show('converted to uuids', uuids)
uuids.sort()
show('sorted', uuids)
从输⼊中去除外围⼤括号,另外将短横线(-)也去除。如果串有⼀个包含urn:或uuid:的前缀,则这个前缀也会被删除。剩下的⽂本必然是由⼗六进制数构成的串,然后再将它解释为⼀个UUID值。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论