12.8.2 UUID 3和5:基于名字的值
有些情况下可能需要根据名字创建UUID值,而不是根据随机值或基于时间的值来创建。UUID3和5规范使用密码散列值(分别使用MD5或SHA-1),将特定与命名空间的种子值与名字相结合。有一些由预定义UUID值标识的公开的命名空间,分别用于处理DNS、URL、ISO OID和X.500识别名(Distinguished Name)。通过生成和保存UUID值,还可以定义新的特定于应用的命名空间。
import uuid
hostnames = ['www.doughellmann.com','blog.doughellmann.com']
for name in hostnames:
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值总是相同的。
import uuid
namespace_types = sorted(
n
for n in dir(uuid)
if n.startswith('NAMESPACE_')
)
name = 'www.doughellmann.com'
for namespace_type in namespace_types:
print(namespace_type)
namespace_uuid = getattr(uuid,namespace_type)
print(' ',uuid.uuid3(namespace_uuid,name))
print(' ',uuid.uuid5(namespace_uuid,name))
print()
但是命名空间中相同名字的UUID值则是不同的。
运行结果: