1. 参考资料:
Python官方Doc:《20.15. uuid — UUID objects according to RFC 4122》
UUID的算法介绍:《A Universally Unique IDentifier (UUID) URN Namespace》
http://www.cnblogs.com/dkblog/archive/2011/10/10/2205200.html
2. 概述:
UUID是128位的全局唯一标识符,通常由32字节的字符串表示。
它可以保证时间和空间的唯一性,也称为GUID,全称为:
UUID —— Universally Unique IDentifier Python 中叫 UUID
GUID —— Globally Unique IDentifier C# 中叫 GUID
它通过MAC地址、时间戳、命名空间、随机数、伪随机数来保证生成ID的唯一性。
UUID主要有五个算法,也就是五种方法来实现:
- uuid1()——基于时间戳
由MAC地址、当前时间戳、随机数生成。可以保证全球范围内的唯一性, 但MAC的使用同时带来安全性问题,局域网中可以使用IP来代替MAC。
- uuid2()——基于分布式计算环境DCE(Python中没有这个函数)
算法与uuid1相同,不同的是把时间戳的前4位置换为POSIX的UID。 实际中很少用到该方法。
- uuid3()——基于名字的MD5散列值
通过计算名字和命名空间的MD5散列值得到,保证了同一命名空间中不同名字的唯一性, 和不同命名空间的唯一性,但同一命名空间的同一名字生成相同的uuid。
- uuid4()——基于随机数
由伪随机数得到,有一定的重复概率,该概率可以计算出来。
- uuid5()——基于名字的SHA-1散列值
算法与uuid3相同,不同的是使用 Secure Hash Algorithm 1 算法
3.使用方面:
首先,Python中没有基于DCE的,所以uuid2可以忽略;
其次,uuid4存在概率性重复,由无映射性,最好不用;
再次,若在Global的分布式计算环境下,最好用uuid1;
最后,若有名字的唯一性要求,最好用uuid3或uuid5。
4. 编码方法:
# -*- coding: utf-8 -*-
import uuid
name = "test_name"
namespace = "test_namespace"
print uuid.uuid1() # 带参的方法参见Python Doc
print uuid.uuid3(namespace, name)
print uuid.uuid4()
print uuid.uuid5(namespace, name)
import uuid
print hex(uuid.getnode()) #根据系统的mac地址打印 ,但是多个mac就有问题
u = uuid.uuid1() #uuid.uuid1()根据mac地址生成uuid 不带参数就是使用uuid.getnode()
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 '\ttime_low : ', u.time_low
print '\ttime_mid : ', u.time_mid
print '\ttime_hi_version : ', u.time_hi_version
print '\tclock_seq_hi_variant: ', u.clock_seq_hi_variant
print '\tclock_seq_low : ', u.clock_seq_low
print '\tnode : ', u.node
print '\ttime : ', u.time
print '\tclock_seq : ', u.clock_seq
for i in xrange(3):
print uuid.uuid1() #uuid1()里面也包含了时间的影响 这样的迭代其中的一部分因为是时间不同而不同
node1 = uuid.getnode()
print hex(node1), uuid.uuid1(node1) #本机mac地址生成
node2 = 0x1e5274040e
print hex(node2), uuid.uuid1(node2) #根据这个特定mac生成
hostnames = ['www.ailll.com', 'www.dongwm.com']
for name in hostnames:
print name
print '\tMD5 :', uuid.uuid3(uuid.NAMESPACE_DNS, name) #uuid3基于dns和加密算法md5
print '\tSHA-1 :', uuid.uuid5(uuid.NAMESPACE_DNS, name) #uuid5是基于dns和加密算法sha-1
for i in xrange(3):
print uuid.uuid3(uuid.NAMESPACE_DNS, 'www.doughellmann.com') #不基于时间 所以是迭代的是一样的
for i in xrange(3):
print uuid.uuid4() #uuid4是根据随机算法 每次差别很大
def show(msg, l):
print msg
for v in l:
print '\t', v
print
input_values = [
'urn:uuid:f2f84497-b3bf-493a-bba9-7c68e6def80b',
'{417a5ebb-01f7-4ed5-aeac-3d56cd5037b0}',
'2115773a-5bf1-11dd-ab48-001ec200d9e0',
] #用于分析各种格式的字符串创建的UUID对象
show('input_values', input_values)
uuids = [ uuid.UUID(s) for s in input_values ]
show('converted to uuids', uuids)
uuids.sort()
show('sorted', uuids)