uuid字符串用于唯一标识一个对象,uuid生成唯一数字
Uuid是一种通过Python标准库的uuid模块生成通用唯一id(或“uuid”)的快捷方式。以下文章主要介绍Python标准库UUID模块(生成唯一标识)的相关信息,有需要的可以参考一下。
目录
uuid格式构成了Python中的uuid模块。UUID(Universal Unique Identifier,Universal ID)是计算机系统中用来标识信息的128位数字。虽然产生UUID的概率不为零,但它无限接近于零,所以可以忽略不计。因此,每个人都可以建立一个不与他人冲突的UUID。
UUID格式组成
在规范的文本中,UUID的16个八位字节标识32个十六进制(以16为基数)数字,这些数字按字符分成五组显示。8-4-4-4-12的总数是36个字符(32个字母数字字符和4个连字符),例如:
123 e 4567-e89b-12 D3-a456-426655440000xxxxx
XXX-xxxx-mxxxx-Nxxx-
ode() 获取硬件地址。如果给出时钟序列,则将其用作序列号;否则,将选择随机的14位序列号。
# 源码参考
def uuid(node=None, clock_seq=None):...
return UUID(fields=(time_low, time_mid, time_hi_version, clock_seq_hi_variant, clock_seq_low, node), version=1)
fields 各个参数含义如下图:
uuid3()
基于命名空间标识符(实质上是一个UUID)和一个名称(实质上是一个字符串)的MD5哈希值生成的UUID
# 源码参考
def uuid3(namespace, name):"""Generate a UUID from the MD5 hash of a namespace UUID and a name."""
from hashlib import md5
hash = md5(namespace.bytes + bytes(name, "utf-8")).digest()
return UUID(bytes=hash[:16], version=3)
uuid4()
基于随机数生成的UUID
# 源码参考
import osdef uuid4():
"""Generate a random UUID."""
return UUID(bytes=os.urandom(16), version=4)
uuid5()
基于命名空间标识符(实质上是一个UUID)和一个名称(实质上是一个字符串)的SHA-1哈希值生成的UUID
# 源码参考
def uuid5(namespace, name):"""Generate a UUID from the SHA-1 hash of a namespace UUID and a name."""
from hashlib import sha1
hash = sha1(namespace.bytes + bytes(name, "utf-8")).digest()
return UUID(bytes=hash[:16], version=5)
由源码可知,uuid1() 使用的是 UUID(fields=(...))
uuid3()、uuid4()、uuid5() 均使用的是 UUID(bytes=...)
RFC 4122 推荐使用版本5(SHA1)而不是版本3(MD5)
uuid1() 中的getnode()
获取硬件的地址并以48位二进制长度的整数形式返回,这里所说的硬件地址是指网络接口的MAC 地址,如果一个机器有多个网络接口,可能返回其中的任一个。如果获取失败,将按照RFC 4122 的规定随机返回48位数字,并将第8位设置为1(其组播位(第一个八位位组的最低有效位)设置为1)
关于uuid3()和uuid5()中提到的命名空间标识符,uuid模块定义了如下的备选项:
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('6ba7b810-9dad-11d1-80b4-00c04fd430c8'),因此命名空间仅仅作为标识用,定义了name 参数的格式
UUID实际应用
uuid1 适应用分布式计算环境,具有高度的唯一性;
uuid3 和uuid5 适合于一定范围的名字唯一,且需要或可能重复生成UUID 的环境下;
uuid4 最简单,但完全随机,不可控,建议可以在DRF 生成和验证JWT 时做用户的SECRET_KEY 用,用来保证用户每次登录,异设备同时登录,修改密码等操作,JWT 失效问题
UUID 的劣势
1.varchar(36)字符串占用空间比较大,但携带的信息很少,且不直观
2.以此建立索引的时候,非常耗性能且慢
3.UUID 是无序的,但是业务系统很多时候希望生成的 是有序的,或者粗略有序
参考资料:
- uuid — UUID objects according to RFC 4122 https://docs.python.org/3/library/uuid.html
- Python--uuid http://www.cnblogs.com/Security-Darren/p/4252868.html
- Python 使用UUID 库生成唯一ID https://www.cnblogs.com/kaituorensheng/p/5530902.html
- Universally unique identifier https://en.wikipedia.org/wiki/Universally_unique_identifier
- 使用UUID的劣势 https://blog.csdn.net/woshiyexinjie/article/details/83351677
总结
到此这篇关于Python标准库uuid模块(生成唯一标识)的文章就介绍到这了,更多相关Python标准库uuid模块内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。