uuid模块

2019年8月30日 / 19次阅读 / Last Modified 2019年8月30日

UUID是Universally Unique Identifier的缩写,它是在一定的范围内(从特定的名字空间到全球)唯一的由机器生成的标识符。简单说,就是一个你可以认为是唯一的字符串标识。Win系统有的时候使用GUID( Globally Unique Identifier ),其实是一样的概念。Python的uuid模块,可以用来生成UUID。

UUID具有以下含义:

  • 经由一定的算法生成。为了保证UUID的唯一性,标准(RFC4122)定义了包括网卡MAC地址、时间戳、名字空间(Namespace)、随机或伪随机数、时序等元素,以及从这些元素生成UUID的算法。UUID的复杂特性在保证了其唯一性的同时,意味着只能由计算机生成。
  • 非人工指定,非人工识别。UUID是不能人工指定的,除非你冒着UUID重复的风险。UUID的复杂性决定了肉眼凡胎的我们,不能直接从一个UUID知道哪个对象和它关联。
  • 在特定的范围内重复的可能性极小。UUID的生成算法,主要目的就是要保证其唯一性。但这个唯一性是有限的,只在特定的范围内才能得到保证,这和UUID的类型有关。

只要你的应用需要唯一的标识符,就可以考虑使用UUID。UUID是由32个16进制符号表示的字符串,其标准格式为 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8-4-4-4-12) 。

uuid1,基于主机ID和当前时间

uuid1函数,使用主机ID, 序列号和当前时间来生成UUID,可保证全球范围的唯一性。但由于使用该方法生成的UUID中包含有主机的网络地址,因此可能危及隐私(估计不会有人在意吧...)。

>>> import uuid
>>> n = uuid.uuid1()
>>> n
UUID('2688464c-cb30-11e9-a5a0-000c29b72598')
>>> str(n)
'2688464c-cb30-11e9-a5a0-000c29b72598'
>>> uuid.uuid1()
UUID('3032b330-cb30-11e9-a5a0-000c29b72598')
>>> uuid.uuid1()
UUID('3032b331-cb30-11e9-a5a0-000c29b72598')
>>> uuid.uuid1()
UUID('31098f18-cb30-11e9-a5a0-000c29b72598')
>>> uuid.uuid1()
UUID('31098f19-cb30-11e9-a5a0-000c29b72598')
>>> uuid.uuid1()
UUID('31098f1a-cb30-11e9-a5a0-000c29b72598')

uuid1函数返回uuid对象,使用str函数可直接获取uuid字符串。上面示例代码连续调用uuid1,可以看到生成的uuid序列后面部分都是相同的,前面部分在变化。

uuid3,基于MD5

>>> uuid.NAMESPACE_DNS
UUID('6ba7b810-9dad-11d1-80b4-00c04fd430c8')
>>> uuid.uuid3(uuid.NAMESPACE_DNS, 'www.maixj.net')
UUID('6d302fe3-f36e-305e-9b5b-dce663810138')
>>> uuid.uuid3(uuid.NAMESPACE_DNS, 'www.pynote.net')
UUID('29363ccb-2040-3400-bd16-5652812dd8bd')
>>>
>>> uuid.NAMESPACE_URL
UUID('6ba7b811-9dad-11d1-80b4-00c04fd430c8')
>>> uuid.uuid3(uuid.NAMESPACE_URL, 'www.maixj.net')
UUID('1674af6d-5c55-3aaf-8a85-aaae6f666deb')
>>> uuid.uuid3(uuid.NAMESPACE_URL, 'www.pynote.net')
UUID('b99c1884-e474-31b9-bf9b-ea1278b71b77')

uuid3函数需要两个参数,NAMESPACE本身就是一个固定的UUID,后面跟一个字符串,MD5的计算就是基于这两个参数,然后再计算UUID值。用这种方法,如果两个参数相同,生产的UUID也相同。

uuid4,随机生成UUID

网上有人说uuid4函数使用的是伪随机数,有一定重复的概率,不过官方文档没有这方面的说明,只是说 make a random UUID。既然是随机,应该还是有一定重复概率吧。

>>> uuid.uuid4()
UUID('e9056cfe-f9f3-4de3-97be-db5938fc2443')
>>> uuid.uuid4()
UUID('8d4c628c-dae3-499b-ae66-e862461d5bc6')
>>> uuid.uuid4()
UUID('2ea0a2b1-d9e2-4b8a-8300-911814288746')
>>> uuid.uuid4()
UUID('59aab155-8be2-4614-9c60-12b248e83c61')
>>> uuid.uuid4()
UUID('397e3ec7-67e3-48a2-93df-7c5dff383b60')
>>> uuid.uuid4()
UUID('be111e15-05c0-4d68-8087-41efa2eb2463')

uuid4生成UUID,要想重复,恐怕也不太容易。在一些要求不是特别严格的应用场景下,可以使用这种方式来生成。

uuid5, 基于SHA-1

跟uuid3相似,只是改用SHA-1这种hash方式,此函数同样需要两个参数。

>>> uuid.uuid5(uuid.NAMESPACE_DNS, 'www.maixj.net')
UUID('1f820c9b-8fb9-5a9a-b66a-bd0ed7befbe8')
>>> uuid.uuid5(uuid.NAMESPACE_DNS, 'www.pynote.net')
UUID('e951c52f-d790-5552-8092-f4101ee0489e')
>>> uuid.uuid5(uuid.NAMESPACE_URL, 'www.maixj.net')
UUID('ad540c57-adb4-5dc9-9f38-7004c2c58a75')
>>> uuid.uuid5(uuid.NAMESPACE_URL, 'www.pynote.net')
UUID('cf3f980c-0f33-500c-be83-0fcb9f2c4e74')
>>> uuid.uuid5(uuid.NAMESPACE_URL, 'www.pynote.net')
UUID('cf3f980c-0f33-500c-be83-0fcb9f2c4e74')

与uuid3一样,参数相同,得到的UUID就相同,适用于某些需要计算已存在的UUID值的情况。

用具体的值生成UUID对象

用具体的值构建一个python的uuid对象:

>>> x = uuid.UUID('{00010203-0405-0607-0809-0a0b0c0d0e0f}')
>>> x
UUID('00010203-0405-0607-0809-0a0b0c0d0e0f')
>>> str(x)
'00010203-0405-0607-0809-0a0b0c0d0e0f'
>>> x.bytes
b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f'

以上就是对Python的uuid模块的使用介绍。

-- EOF --

本文链接:https://www.pynote.net/archives/1021

相关文章

    留言区

    电子邮件地址不会被公开。 必填项已用*标注


    前一篇:
    后一篇:

    More


    ©Copyright 麦新杰 Since 2019 Python笔记

    go to top