UUID模块
一、UUID介绍
1.什么是UUID?
UUID: 通用唯一标识符 ( Universally Unique Identifier ),对于所有的UUID它可以保证在空间和时间上的唯一性,也称为GUID,全称为:
- UUID —— Universally Unique IDentifier Python中称为 UUID
- GUID —— Globally Unique IDentifier C#中称为 GUID
它是通过MAC地址、 时间戳、 命名空间、 随机数、 伪随机数来保证生成ID的唯一性,,有着固定的大小( 128 bit位 ),通常由 32 字节的字符串(十六进制)表示。
它的唯一性和一致性特点,使得可以无需注册过程就能够产生一个新的UUID;UUID可以被用作多种用途, 既可以用来短时间内标记一个对象,也可以可靠的辨别网络中的持久性对象。
2.UUID有什么用?
很多应用场景需要一个id,但是又不要求这个id 有具体的意义,仅仅用来标识一个对象。常见的用处有数据库表的id字段;另一个例子是前端的各种UI库,因为它们通常需要动态创建各种UI元素,这些元素需要唯一的id, 这时候就需要使用UUID了。例如:一个网站在存储视频、图片等格式的文件时,这些文件的命名方式就可以采用 UUID生成的随机标识符,避免重名的出现。
3.什么时候用UUID?
注意:何时使用UUID取决于情况,用例,条件和复杂性。
- 生成唯一的统一资源名称。UUID具有固定大小(128位),与其他替代方法相比,它很小。如您所知,UUID是唯一且持久的,它是统一资源名称的绝佳选择
- 生成UUID不需要注册过程
- 我们甚至可以将UUID用作交易ID
- 在加密应用程序中的显着用途
在Web应用程序中
- UUID也很方便生成**唯一的会话ID,**以帮助状态管理。
- 生成用户ID。如果使用自动增量值生成用户ID,则非常简单且容易猜到。人们可以使用整数值来猜测并尝试使用用户ID访问用户。但是,当您使用UUID时,很难猜测,因为UUID并非以任何顺序格式创建的,因此很难猜测其顺序。
在数据库系统中
- UUID具有显着的优势,因为UUID与环境无关。即,在使用任何应用程序的任何计算机上生成的UUID都是唯一的。
- 由于大多数应用程序都依赖于基础数据库服务器来生成唯一键或主键。如果我们想更改密钥生成不同的数据库该怎么办。在这种情况下,一个不错的选择是在应用程序中使用UUID生成唯一的数据库密钥。
- 同样,UUID也适用于分布式环境。我们可以拆分一个表并将其放置在多个物理数据库服务器上。如果我们有一个自动增量密钥,我们必须开发一个合适的算法来管理它。
- 同样,UUID是一个实值,而不是像SQL表中的数字一样的伪值。
考虑以上情况时,实际上UUID方法在生成数据库密钥方面更为独特和通用。由于自动增量不适用于分布式系统,因此大多数数据库服务器(包括MS SQL Server,MySQL或Oracle)以及更多数据库服务器使用UUID生成数据库密钥,以唯一地标识资源或信息。
4.UUID的结构
UUID由五个组件组成,每个组件都有固定的长度。连字符将各个部分分开。UUID的格式为“ 8-4-4-4-12”。
UUID字符串表示形式的正式定义如下:
UUID = time_low “-” time_mid “-“time_high_and_version ” “clock_seq_and_reserved_And_clock_seq_low“-” Node.
二、UUID属性只读属性
UUID的内部表示是内存中特定的位序列,如RFC4211中所述。必须将位序列转换为字符串表示形式,以字符串格式表示UUID。
UUID模块提供各种只读参数来访问UUID对象的每个组件的值。您可以从UUID中提取值,以便我们可以将此值用于其他目的。例如,您要从python中的UUID version1中提取时间。
UUID只读属性包括以下内容:–
- UUID.bytes: UUID为16字节的字符串(包含按big-endian字节顺序排列的六个整数字段)。
- **UUID.bytes_le:**这是一个16字节的字符串,由time_low,time_mid和time_hi_version组成。
- UUID.fields: UUID的六个整数字段的元组,也可以作为六个单独的属性和两个派生的属性使用:UUID.fields具有以下字段。
字段 | 含义 |
---|---|
time_low | UUID的前32位 |
time_mid | UUID的后16位 |
time_hi_version | UUID的后16位 |
clock_seq_hi_variant | UUID的后8位 |
clock_seq_low | UUID的后8位 |
node | UUID的后48位 |
time | 60位时间戳 |
clock_seq | 14位序号 |
- UUID.hex: UUID为32个字符的十六进制字符串。
- UUID.int:UUID的整数表示形式,为128位整数。
- UUID.urn: UUID作为统一资源名称。
- UUID.variant: UUID变体,它确定UUID的内部布局。这将是常量RESERVED_NCS,RFC_4122,RESERVED_MICROSOFT或RESERVED_FUTURE之一。
- UUID.version: UUID的版本。1、4、3和5之间的任何值。
- UUID.is_safe: 了解UUID生成是否安全。我们将在本文的后半部分看到这一点。
三、UUID模块提供的UUID类和函数
python的uuid模块提供的UUID类和函数uuid1(),uuid3(),uuid4(),uuid5() 来生成1, 3, 4, 5各个版本的UUID ( 需要注意的是:python中没有uuid2()这个函数)。
1.uuid.uuid1([node[, clock_seq]])
—>基于时间戳
如何生成?
- MAC地址、当前时间戳、随机数生成
优点:
- 保证全球范围内的唯一性
缺点:
- MAC的使用同时带来安全性问题,局域网中可以使用IP来代替MAC
该函数有两个参数, 如果 node 参数未指定, 系统将会自动调用 getnode() 函数来获取主机的硬件地址. 如果 clock_seq 参数未指定系统会使用一个随机产生的14位序列号来代替.
注意: uuid1() 返回的不是普通的字符串,而是一个 uuid 对象,其内含有丰富的成员函数和变量。
2.uuid.uuid2()—>基于分布式计算环境DCE(Python中没有这个函数)
- 算法与uuid1相同,不同的是把时间戳的前4位置换为POSIX的UID。
- 实际中很少用到该方法。
3.uuid.uuid3(namespace, name)
—>基于名字的MD5散列值
如何生成?
- 通过计算名字和命名空间的MD5散列值得到
优点:
- 保证了同一命名空间中不同名字的唯一性,和不同命名空间的唯一性
缺点:
- 同一命名空间的同一名字生成相同的uuid
4.uuid.uuid4()—>基于随机数
如何生成?
- 由伪随机数得到
缺点:
- 有一定的重复概率,该概率可以计算出来
5.uuid.uuid5()
—>基于名字的SHA-1散列值
如何生成?
- 算法与uuid3相同,不同的是使用 Secure Hash Algorithm 1 算法
6.使用方面:
首先,Python中没有基于DCE的,所以uuid2可以忽略;
其次,uuid4存在概率性重复,由无映射性,最好不用;
再次,若在Global的分布式计算环境下,最好用uuid1;
最后,若有名字的唯一性要求,最好用uuid3或uuid5。
四、代码示例:
注意:他们返回值类型是一个类, 如果你想作为字符串拼接请使用str()函数进行转换
import uuid
name = 'test_name'
namespace = uuid.NAMESPACE_DNS
a = uuid.uuid1()
print(a, type(a)) # 7838428c-a274-11eb-9d89-8c16450613fc <class 'uuid.UUID'>
b = uuid.uuid3(namespace, name)
print(b, type(b)) # 7e9fc176-3b19-394a-9530-83391161f8e9 <class 'uuid.UUID'>
c = uuid.uuid4()
print(c, type(c)) # dfc762ad-2283-473f-bc4d-8a396955a396 <class 'uuid.UUID'>
d = uuid.uuid5(namespace, name)
print(d, type(d)) # ad85ae8c-f638-56e0-b9fc-5d7a58009f62 <class 'uuid.UUID'>
参考资料
- 官网文档:https://docs.python.org/3.6/library/uuid.html
- 博客园详解版:https://www.cnblogs.com/freeaihub/p/13139237.html
- 博客园:https://www.cnblogs.com/hellojesson/p/6410445.html
- 博客园:https://www.cnblogs.com/yunwangjun-python-520/p/11695864.html