2019年8月30日 / 552次阅读 / Last Modified 2019年8月30日
UUID是Universally Unique Identifier的缩写,它是在一定的范围内(从特定的名字空间到全球)唯一的由机器生成的标识符。简单说,就是一个你可以认为是唯一的字符串标识。Win系统有的时候使用GUID( Globally Unique Identifier ),其实是一样的概念。Python的uuid模块,可以用来生成UUID。
UUID具有以下含义:
只要你的应用需要唯一的标识符,就可以考虑使用UUID。UUID是由32个16进制符号表示的字符串,其标准格式为 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8-4-4-4-12) 。
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序列后面部分都是相同的,前面部分在变化。
>>> 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函数使用的是伪随机数,有一定重复的概率,不过官方文档没有这方面的说明,只是说 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,要想重复,恐怕也不太容易。在一些要求不是特别严格的应用场景下,可以使用这种方式来生成。
跟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值的情况。
用具体的值构建一个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
前一篇:tkinter选择文件(夹)的对话框
后一篇:abs函数和加减号的合并对冲
©Copyright 麦新杰 Since 2019 Python笔记