长安古道马迟迟,高柳乱蝉嘶。夕阳岛外,秋风原上,目断四天垂。
归云一去无踪迹,何处是前期?狎兴生疏,酒徒萧索,不似少年时。
一、UUID的介绍:
UUID: 通用唯一标识符 ( Universally Unique Identifier ), 对于所有的UUID它可以保证在空间和时间上的唯一性. 它是通过MAC地址, 时间戳, 命名空间, 随机数, 伪随机数来保证生成ID的唯一性, 有着固定的大小( 128 bit ). 它的唯一性和一致性特点使得可以无需注册过程就能够产生一个新的UUID. UUID可以被用作多种用途, 既可以用来短时间内标记一个对象, 也可以可靠的辨别网络中的持久性对象.
为什么要使用UUID?
很多应用场景需要一个id, 但是又不要求这个id 有具体的意义, 仅仅用来标识一个对象. 常见的例子有数据库表的id 字段. 另一个例子是前端的各种UI库, 因为它们通常需要动态创建各种UI元素, 这些元素需要唯一的id , 这时候就需要使用UUID了.
二、uuid模块的使用:
python的uuid模块提供UUID类和函数uuid1(), uuid3(), uuid4(), uuid5() 来生成1, 3, 4, 5各个版本的UUID ( 需要注意的是: python中没有uuid2()这个函数). 对uuid模块中最常用的几个函数总结如下:
uuid.uuid1(node, clock_seq) : 基于MAC地址,时间戳,随机数
基于MAC地址,时间戳,随机数来生成唯一的uuid,可以保证全球范围内的唯一性。但由于使用该方法生成的UUID中包含有主机的网络地址, 因此可能危及隐私。 该函数有两个参数, 如果 node 参数未指定, 系统将会自动调用 getnode() 函数来获取主机的硬件地址. 如果 clock_seq 参数未指定系统会使用一个随机产生的14位序列号来代替uuid.uuid2()
算法与uuid1相同,不同的是把时间戳的前4位置换为POSIX的UID。不过需要注意的是python中没有基于DCE的算法,所以python的uuid模块中没有uuid2这个方法。uuid.uuid3(namespace, name) : 基于名字的MD5散列值
通过计算一个命名空间和名字的md5散列值来给出一个uuid,所以可以保证命名空间中的不同名字具有不同的uuid,但是相同的名字就是相同的uuid了。namespace并不是一个自己手动指定的字符串或其他量,而是在uuid模块中本身给出的一些值。比如uuid.NAMESPACE_DNS,uuid.NAMESPACE_OID,uuid.NAMESPACE_OID这些值。这些值本身也是UUID对象,根据一定的规则计算得出。uuid.uuid4() : 基于随机数
通过随机数来生成UUID. 使用的是伪随机数有一定的重复概率uuid.uuid5(namespace, name) : 基于名字的SHA-1散列值
和uuid3基本相同,只不过采用的散列算法是sha1
三、uuid的简单使用:
import uuid
name = 'wangjifei'
namespace = uuid.NAMESPACE_OID
print(uuid.uuid1())
print(uuid.uuid3(namespace,name))
print(uuid.uuid4())
print(uuid.uuid5(namespace,name))
42a5d474-d276-11e8-be0c-001cc2340bf8
1c0451f9-4b46-381a-8039-43ecc91bc0c0
c5207330-6c9c-4285-bcca-163e24aaeac3
41e1be5c-b568-5e5d-8ce2-f4609fd3bec5