Python模块--uuid

一 概述

UUID:通用唯一标识符 ( Universally Unique Identifier ),对于所有的UUID它可以保证在空间和时间上的唯一性。它是通过MAC地址、时间戳、命名空间、随机数、伪随机数来保证生成ID的唯一性,有着固定的大小( 128 bit ,32 字节的字符串(十六进制))。它的唯一性和一致性特点使得可以无需注册过程就能够产生一个新的UUID。UUID可以被用作多种用途,既可以用来短时间内标记一个对象,也可以可靠的辨别网络中的持久性对象。

在C#中称为 GUID--Globally Unique IDentifier。

UUID主要有五个算法,也就是五种方法来实现:

1. uuid1(node=None, clock_seq=None):基于时间戳

使用主机ID, 序列号, 和当前时间来生成UUID, 可保证全球范围的唯一性. 但由于使用该方法生成的UUID中包含有主机的网络地址, 因此可能危及隐私. 该函数有两个参数, 如果 node 参数未指定, 系统将会自动调用 getnode() 函数来获取主机的硬件地址. 如果 clock_seq  参数未指定系统会使用一个随机产生的14位序列号来代替.

2. uuid2():基于分布式计算环境DCE(python中没有这个函数)

算法和uuid1相同,不同的是把时间戳的前4位换位POSIX的UID,实际中很少用到该方法

3. uuid3(namespace, name):基于名字和MD5散列值

通过计算命名空间和名字的MD5散列值来生成UUID,可以保证同一命名空间中不同名字的唯一性和不同命名空间的唯一性,但同一命名空间的同一名字生成的UUID相同

4. uuid4():基于随机数

通过随机数来生成UUID,使用的是伪随机数,有一定的重复概率.

5. uuid5(namespace, name):基于名字的SHA-1散列值

通过计算命名空间和名字的SHA-1散列值来生成UUID,算法与 uuid.uuid3() 相同

使用建议:

  • Python中没有基于DCE的,所以uuid2可以忽略
  • uuid4存在概率性重复,由无映射性,建议不用
  • 如果在global的分布式计算环境下,建议用uuid1
  • 若有名字的唯一性要求,建议使用uuid3或uuid5

二 使用实践

import uuid

u1 = uuid.uuid1()
print(u1)       # eeff152c-5a7a-11e8-b54f-28d2446cf369

u3 = uuid.uuid3(uuid.NAMESPACE_DNS, 'uuid3_test')
print(u3)       # 2c9d15c0-d2f9-33b9-ae67-a5005673c25f

u4 = uuid.uuid4()
print(u4)       # d7ba99d5-694e-49ad-9c30-17cbd9cef196

u5 = uuid.uuid5(uuid.NAMESPACE_DNS, 'uuid5_test')
print(u5)       # 193a3a03-20bb-5e42-a21a-e531b32b91a4

UUID使用场景:

很多时候我们需要一个id, 但是又不要求这个id 有具体的意义,仅仅用来标识一个对象,这时候我们就可以使用UUID

posted @ 2018-07-01 17:13  Joe1991  阅读(133)  评论(0)    收藏  举报