| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Python知识库 -> Python 模块 UUID 学习使用 -> 正文阅读 |
|
[Python知识库]Python 模块 UUID 学习使用 |
Python 模块 UUID 学习使用一、UUID介绍UUID: 通用唯一标识符 ( Universally Unique Identifier ), 对于所有的UUID它可以保证在空间和时间上的唯一性. 它是通过 为什么要使用UUID? 很多应用场景需要一个id, 但是又不要求这个id 有具体的意义, 仅仅用来标识一个对象. 常见的例子有数据库表的id 字段. 另一个例子是前端的各种UI库, 因为它们通常需要动态创建各种UI元素, 这些元素需要唯一的id , 这时候就需要使用UUID了. 二、Python uuid模块介绍python的uuid模块提供UUID类和函数 2.1、 使用主机ID, 序列号, 和当前时间来生成UUID, 可保证全球范围的唯一性. 但由于使用该方法生成的UUID中包含有主机的网络地址, 因此可能危及隐私. 该函数有两个参数, 如果 node 参数未指定, 系统将会自动调用 2.2、 通过计算命名空间和名字的MD5散列值来生成UUID, 可以保证同一命名空间中不同名字的唯一性和不同命名空间的唯一性, 但同一命名空间的同一名字生成的UUID相同. 2.3、 通过随机数来生成UUID. 使用的是伪随机数有一定的重复概率. 2.4、 通过计算命名空间和名字的SHA-1散列值来生成UUID, 算法与 uuid.uuid3() 相同. 三、python 中uuid 方法介绍3.1、uuid.UUID 类
3.2、uuid对象属性3.2.1、
|
域 | 含义 |
---|---|
time_low | UUID的初始32位 |
time_mid | 接前一域的16位 |
time_hi_version | 接前一域的16位 |
clock_seq_hi_variant | 接前一域的8位 |
clock_seq_low | 接前一域的8位 |
node | UUID的最后48位 |
time | UUID的总长60位的时间戳 |
clock_seq | 14位的序列号 |
>>> import uuid
>>> b = uuid.uuid3(uuid.NAMESPACE_DNS, "123")
>>> b
UUID('4dfc6b14-7213-3363-8009-b23c56e3a1b1')
>>> b.fields
(1308388116L, 29203L, 13155L, 128L, 9L, 195972225540529L)
UUID.hex
以32个字符表示的UUID
>>> import uuid
>>> b = uuid.uuid3(uuid.NAMESPACE_DNS, "123")
>>> b
UUID('4dfc6b14-7213-3363-8009-b23c56e3a1b1')
>>> b.hex
'4dfc6b14721333638009b23c56e3a1b1'
UUID.int
以一个长度为128个二进制位的整数表示的UUID;
>>> import uuid
>>> b = uuid.uuid3(uuid.NAMESPACE_DNS, "123")
>>> b
UUID('4dfc6b14-7213-3363-8009-b23c56e3a1b1')
>>> b.int
103661186321484643176355349665283285425L
UUID.urn
以 RFC 4122 中指定的URN形式表示的UUID
>>> import uuid
>>> b = uuid.uuid3(uuid.NAMESPACE_DNS, "123")
>>> b
UUID('4dfc6b14-7213-3363-8009-b23c56e3a1b1')
>>> b.urn
'urn:uuid:4dfc6b14-7213-3363-8009-b23c56e3a1b1'
UUID.variant
UUID变体(variant),决定UUID内部的布局,已有的值为 RESERVED_NCS、``RFC_4122、``RESERVED_MICROSOFT
或 RESERVED_FUTURE
变量(variant), 或称做类型, 4 bytes, 包括以下4种(其中X为任意值):
0XX NCS兼容预留
10X RFC4122采用
110 微软兼容预留
111 还未定义, 留作以后它用
>>> import uuid
>>> b = uuid.uuid3(uuid.NAMESPACE_DNS, "123")
>>> b
UUID('4dfc6b14-7213-3363-8009-b23c56e3a1b1')
>>> b.variant
'specified in RFC 4122'
UUID.version
UUID版本,只有当变体为 RFC_4122 时才有效。
0001 时间的版本
0010 DCE Security
0011 MD5哈希
0100 (伪)随机数
0101 SHA-1哈希
>>> import uuid
>>> b = uuid.uuid3(uuid.NAMESPACE_DNS, "123")
>>> b
UUID('4dfc6b14-7213-3363-8009-b23c56e3a1b1')
>>> b.version
3
uuid.getnode()
获取硬件的地址并以48位二进制长度的正整数形式返回,这里所说的硬件地址是指网络接口的MAC地址,如果一个机器有多个网络接口,可能返回其中的任一个。如果获取失败,将按照RFC 4122的规定将随机返回的48位二进制整数的第8位设置成1。
>>> import uuid
>>> b1 = uuid.getnode()
>>> b1
190070690681122
uuid.uuid1([node[, clock_seq]])
利用主机ID、序列号和当前时间生成一个UUID,如果参数 node 没有给定,会调用 getnode() 来获取硬件地址。如果参数中指定了 clock_seq ,使用参数中给定的时钟序列作为序列号,否则使用一个随机的14位长的序列号。
>>> import uuid
>>> b2 = uuid.uuid1()
>>> b2
UUID('326ee180-cf44-11ec-af81-acde48001122')
>>> b3 = uuid.uuid1(190070690681122)
>>> b3
UUID('f059ef8a-cf44-11ec-a1cd-acde48001122')
uuid.uuid3(namespace, name)
基于命名空间标识符(实质上是一个UUID)和一个名称(实质上是一个字符串)的MD5哈希值生成UUID。
>>> import uuid
>>> b = uuid.uuid3(uuid.NAMESPACE_DNS, "123")
>>> b
UUID('4dfc6b14-7213-3363-8009-b23c56e3a1b1')
uuid.uuid4()
生成一个随机的UUID
>>> import uuid
>>> c = uuid.uuid4()
>>> c
UUID('a46e5f4c-5945-496c-80d5-6a72ac11523b')
uuid.uuid5(namespace, name)
基于命名空间标识符(实质上是一个UUID)和一个名称(实质上是一个字符串)的SHA-1哈希值生成UUID
>>> import uuid
>>> d = uuid.uuid5(uuid.NAMESPACE_DNS, "123")
>>> d
UUID('37813542-0dca-5a8a-b2a2-b69c2d45583f')
uuid.NAMESPACE_DNS
当指定该命名空间时,参数 name 是一个完全限定的(fully-qualified)域名
uuid.NAMESPACE_URL
当指定该命名空间时,参数 name 是一个URL
uuid.NAMESPACE_OID
当指定该命名空间时,参数 name 是一个ISO OID
uuid.NAMESPACE_X500
当指定该命名空间时,参数 name 是一个DER格式或文本格式的X.500 DN。
uuid.RESERVED_NCS
该常量为兼容NCS而保留;0XX NCS兼容预留
>>> import uuid
>>> d1 = uuid.RESERVED_NCS
>>> d1
'reserved for NCS compatibility'
uuid.RFC_4122
按照 RFC 4122 的规定来确定UUID的布局;10X RFC4122采用
>>> import uuid
>>> d2 = uuid.RFC_4122
>>> d2
'specified in RFC 4122'
uuid.RESERVED_MICROSOFT
该常量位兼容微软而保留;110 微软兼容预留
>>> import uuid
>>> d3 = uuid.RESERVED_MICROSOFT
>>> d3
'reserved for Microsoft compatibility'
uuid.RESERVED_FUTURE
该常量为未来可能的定义保留,111 还未定义, 留作以后它用
>>> import uuid
>>> d4 = uuid.RESERVED_FUTURE
>>> d4
'reserved for future definition'
版本1: 时间戳采用UTC时间,以100ns为间隔,重1582年10月15日00:00:00.00开始计算
版本1: 用来防止在时间回调的情况下,导致的UUID重复问题
如果有时间回调(可能有系统断电导致),如果生成器在回调时间之后有生成新的UUID,那么时钟序列应该改变, 如果新生成的UUID时钟序列可知,那么时钟序列递增即可; 若不可知, 那么时钟序列应重置到一个47位随机数,或一个47位高质量的伪随机数,并且第48位设置为1,用来区别真正的MAC地址(由于所有MAC地址在网卡中第48为0)
版本1: 为主机MAC地址, 若主机有多个MAC地址,随机选其中一个, 若系统没有MAC地址, 则采用(伪)随机数.
import uuid
# 使用uuid1创建随机id
UID = uuid.uuid1()
# 打印标准ID
print ("标准值: ", UID)
# 打印字节ID
print ("字节ID: ", repr(UID.bytes))
# 打印整数ID
print ("整数值: ", UID.int)
# Print the hex ID
print ("十六进制值: ", UID.hex)
# 打印版本号
print ("版本号为 :", UID.version)
# 打印字段值
print ("字段是 ", UID.fields)
# 以十六进制打印MAC值
print ("节点值为: ", hex(UID.node))
# 打印时间值
print ("时间值为: ", UID.time)
# 结果如下
('\xe6\xa0\x87\xe5\x87\x86\xe5\x80\xbc: ', UUID('ce96a4ab-cf47-11ec-9f71-acde48001122'))
('\xe5\xad\x97\xe8\x8a\x82ID: ', '\'\\xce\\x96\\xa4\\xab\\xcfG\\x11\\xec\\x9fq\\xac\\xdeH\\x00\\x11"\'')
('\xe6\x95\xb4\xe6\x95\xb0\xe5\x80\xbc: ', 274603151587812998186977116984306569506L)
('\xe5\x8d\x81\xe5\x85\xad\xe8\xbf\x9b\xe5\x88\xb6\xe5\x80\xbc: ', 'ce96a4abcf4711ec9f71acde48001122')
('\xe7\x89\x88\xe6\x9c\xac\xe5\x8f\xb7\xe4\xb8\xba :', 1)
('\xe5\xad\x97\xe6\xae\xb5\xe6\x98\xaf ', (3465979051L, 53063L, 4588L, 159L, 113L, 190070690681122L))
('\xe8\x8a\x82\xe7\x82\xb9\xe5\x80\xbc\xe4\xb8\xba: ', '0xacde48001122L')
('\xe6\x97\xb6\xe9\x97\xb4\xe5\x80\xbc\xe4\xb8\xba: ', 138713595857249451L)
import uuid
# 定义三个主机名的元组
hosts = ('www.linuxmi.com', 'www.google.com', 'www.kotlin.ai')
# 使用loop迭代元组的值
for hostname in hosts:
# 打印主机名
print("主机名: ", hostname)
# 使用uuid5获得SHA- 1值
print('tSHA-1值 :', uuid.uuid5(uuid.NAMESPACE_DNS, hostname))
# 使用uuid3获取MD5值
print('tMD5值 :', uuid.uuid3(uuid.NAMESPACE_DNS, hostname))
# 结果如下
('\xe4\xb8\xbb\xe6\x9c\xba\xe5\x90\x8d: ', 'www.linuxmi.com')
('tSHA-1\xe5\x80\xbc :', UUID('2e7f9640-0358-54bb-ac54-10274483cc0f'))
('tMD5\xe5\x80\xbc :', UUID('008f758f-b1e7-367b-b3ca-6fb529777928'))
('\xe4\xb8\xbb\xe6\x9c\xba\xe5\x90\x8d: ', 'www.google.com')
('tSHA-1\xe5\x80\xbc :', UUID('488416f4-fcaf-5027-8c63-0105cfa213ea'))
('tMD5\xe5\x80\xbc :', UUID('de87628d-5377-3ba7-b31b-cde1cc8d423f'))
('\xe4\xb8\xbb\xe6\x9c\xba\xe5\x90\x8d: ', 'www.kotlin.ai')
('tSHA-1\xe5\x80\xbc :', UUID('d670314f-80be-5863-ba31-9b46be9fa355'))
('tMD5\xe5\x80\xbc :', UUID('ee11a1b9-3ce6-39b7-b311-cded3c178ba5'))
import uuid
i = 1
# 循环五次
while i < 6:
# 产生一个随机数
print("No-", i, ' ', uuid.uuid4)
# 将值增加一
i = i + 1
# 结果如下
('No-', 1, ' ', <function uuid4 at 0x105050c50>)
('No-', 2, ' ', <function uuid4 at 0x105050c50>)
('No-', 3, ' ', <function uuid4 at 0x105050c50>)
('No-', 4, ' ', <function uuid4 at 0x105050c50>)
('No-', 5, ' ', <function uuid4 at 0x105050c50>)
import uuid
# 创建一个有效格式的id list
list_Ids = [
'a4f8dd97-c8be-345b-239e-8a68e6abf800',
'673a5eaa-56c6-aaaa-bc45-4536cd9067ac',
'dcbbaa88-5bf1-11dd-ab48-990ab200d674',
'4567aabb-89ad-77ab-67ad-aaaccdd904ae'
]
# 使用loop打印列表值
print('nlist的值:')
for val in list_Ids:
print (val)
# list的值将被转换为uuid并进行排序
try:
uuids = [uuid.UUID(s) for s in list_Ids]
uuids.sort
print('n已排序uuid的值:')
for val in uuids:
print (val)
except ValueError:
# 如果list的任何值的格式无效,则打印错误消息
print('格式不正确的十六进制UUID字符串')
# 结果如下
nlist的值:
a4f8dd97-c8be-345b-239e-8a68e6abf800
673a5eaa-56c6-aaaa-bc45-4536cd9067ac
dcbbaa88-5bf1-11dd-ab48-990ab200d674
4567aabb-89ad-77ab-67ad-aaaccdd904ae
n已排序uuid的值:
a4f8dd97-c8be-345b-239e-8a68e6abf800
673a5eaa-56c6-aaaa-bc45-4536cd9067ac
dcbbaa88-5bf1-11dd-ab48-990ab200d674
4567aabb-89ad-77ab-67ad-aaaccdd904ae
1、https://blog.csdn.net/catwan/article/details/84998986
2、https://www.cnblogs.com/Security-Darren/p/4252868.html
3、https://baike.baidu.com/item/RFC/1840?fr=aladdin
4、https://www.sohu.com/a/400851011_495675
5、https://segmentfault.com/a/1190000000484508
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/27 18:50:39- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |