Python模块学习--uuid

一、前言:

UUID主要有五个算法,也就是五种方法来实现。
python3的UUID模块:该模块提供不可变的UUID对象(UUID类)和函数uuid1(),uuid3(),uuid4(),uuid5()来生成1,3,4,5各个版本的UUID(python中没有uuid2这个函数)。

1、uuid1(node=None, clock_seq=None)—基于时间戳

基于时间的UUID通过计算当前时间戳、随机数和机器MAC地址得到。由于在算法中使用了MAC地址,这个版本的UUID可以保证在全球范围的唯一性。但与此同时,使用MAC地址会带来安全性问题,这就是这个版本UUID受到批评的地方。如果应用只是在局域网中使用,也可以使用退化的算法,以IP地址来代替MAC地址。

该函数有两个参数, 如果node参数未指定, 系统将会自动调用getnode()函数来获取主机的硬件地址。如果clock_seq参数未指定系统会使用一个随机产生的14位序列号来代替。

uuid模块使用getnode()来获取当前系统的MAC值。如果一个系统有多个网卡,那么响应地便会有多个MAC地址,并且可能返回其中任意一个值。节点标识符参数是可选的;如果没有设置这个域,那么便会使用getnode()返回的值。
在这里插入图片描述
对于返回的UUID对象,可以通过只读的实例属性访问它的各个部分。有些属性是UUID值的不同表示,如hex,int和urn。
在这里插入图片描述
由于每个计算机有不同的MAC地址,所以在不同系统上运行这个示例程序会生成完全不同的值。下一个例子传递不同节点ID来模拟在不同主机上运行。
在这里插入图片描述

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

DCE(Distributed Computing Environment)安全的UUID和基于时间的UUID算法相同,但会把时间戳的前4位置换为POSIX的UID或GID。这个版本的UUID在实际中较少用到。

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

通过计算名字和命名空间的MD5散列值得到,保证了同一命名空间中不同名字的唯一性,和不同命名空间的唯一性,
但同一命名空间的名字生成相同的uuid。

4、uuid4()—基于随机数

根据随机数,或者伪随机数生成UUID。这种UUID产生重复的概率是可以计算出来的,但随机的东西就像是买彩票:你指望它发财是不可能的,但狗屎运通常会在不经意中到来。

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

算法和uuid3()相同,不同的是使用Secure Hash Algorithm 1 算法。

二、在什么场景下使用:

  1. 如果在global的分布式计算环境下,最好用uuid1
  2. Python中没有基于DCE的,所以uuid2可以忽略
  3. 若有名字的唯一性要求,最好使用uuid3或uuid5
    有些情况下可能需要根据名字创建UUID值,而不是根据随机值或基于时间的值来创建。uuid3(使用MD5)和uuid5(使用SHA-1)规范使用密码散列值,将特定与命名空间的种子值与名字相结合。有一些由预定义UUID值标识的公开的命名空间,分别用于处理DNS、URL、ISO OID和X.500识别名(Distinguished Name)。通过生成和保存UUID值,还可以定义新的特定于应用的命名空间。
  4. uuid4存在概率性重复,由于无映射性,最好不用
    其中uuid4()没有映射性,也就是说在某些需要保密的场景下其他三种生成的id是可能被后门记录且还原得到的。
    使用哪种方法还是要看具体场景,事实上,一般uuid1()是最常用的,因为不少人认为uuid4()生成的id可能出现重复,尽管概率非常非常低。

三、下面的内容(官方)来自:https://docs.python.org/3/library/uuid.html

>>> import uuid

>>> # make a UUID based on the host ID and current time
>>> uuid.uuid1()
UUID('a8098c1a-f86e-11da-bd1a-00112444be1e')

>>> # make a UUID using an MD5 hash of a namespace UUID and a name
>>> uuid.uuid3(uuid.NAMESPACE_DNS, 'python.org')
UUID('6fa459ea-ee8a-3ca4-894e-db77e160355e')

>>> # make a random UUID
>>> uuid.uuid4()
UUID('16fd2706-8baf-433b-82eb-8c7fada847da')

>>> # make a UUID using a SHA-1 hash of a namespace UUID and a name
>>> uuid.uuid5(uuid.NAMESPACE_DNS, 'python.org')
UUID('886313e1-3b8a-5372-9b90-0c9aee199e5d')

>>> # make a UUID from a string of hex digits (braces and hyphens ignored)
>>> x = uuid.UUID('{00010203-0405-0607-0809-0a0b0c0d0e0f}')

>>> # convert a UUID to a string of hex digits in standard form
>>> str(x)
'00010203-0405-0607-0809-0a0b0c0d0e0f'

>>> # get the raw 16 bytes of the UUID
>>> x.bytes
b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f'

>>> # make a UUID from a 16-byte string
>>> uuid.UUID(bytes=x.bytes)
UUID('00010203-0405-0607-0809-0a0b0c0d0e0f')

猜你喜欢

转载自blog.csdn.net/m0_37739193/article/details/114776855