为数据库和web应用程序制作更好的带时间戳uuid的库

uuid0的Python项目详细描述


v4 uuid通常用作主键或数据库索引的一部分。 然而,它们的随机性和非连续性会导致局部性和 性能问题。

这个python 3包通过使用unix编码来缓解这些问题 uuid的前6个字节中的时间戳,并填充剩余的字节 随机数据。uuid0.UUID类继承自标准 uuid.UUID类,因此可以安全地使用所有常用属性(hex,int, 字节等)

包还包含uuid0.django,它提供django表单和 基于uuid0类型以及抽象UUID0Model的模型字段。

状态

此软件包处于alpha状态,请自行承担使用风险。

用法

通过运行安装:

pip install uuid0

示例用法:

>>> import uuid0

# make a UUID based on the current time
>>> uuid0.generate()
UUID('0dc7ef03-c534-d288-67b7-34cf4dfa9350')

# make a UUID from a string of hex digits (braces and hyphens ignored)
>>> x = uuid0.UUID('{0b7dd8d0-7e40-8360-9322-4a361d7b573f}')

# extract the datetime from a UUID
>>> str(x.datetime)
'2010-01-15 00:00:36'

# convert a UUID to a string of hex digits in standard form
>>> str(x)
'0b7dd8d0-7e40-8360-9322-4a361d7b573f'

# convert a UUID to a base62 string
>>> x.base62
'LgQWTxkOpLyTaEuRAav9D'

# make a UUID from a base62 string
>>> uuid0.UUID(base62=x.base62)
UUID('0b7dd8d0-7e40-8360-9322-4a361d7b573f')

# get the raw 16 bytes of the UUID
>>> x.bytes
b'\x0b}\xd8\xd0~@\x83`\x93"J6\x1d{W?'

# make a UUID from a 16-byte string
>>> uuid0.UUID(bytes=x.bytes)
UUID('0b7dd8d0-7e40-8360-9322-4a361d7b573f')

碰撞怎么办?

当然,碰撞是个问题,但前提是 large短时间内的uuid数量。

默认情况下,uuid0只使用6个字节来编码时间,而不编码任何 版本位,留下10字节(80位)的随机数据。

对于大多数用例来说,冲突的概率几乎为零,因为 1/10000s期间,有2个80个可能的uuid。

性能

生成uuid0比生成uuid v4慢,但比 Uuid v1.

下面是i7-6700hq和python 3.6.2上500k次迭代的结果 (使用benchmarks/generate.py脚本生成):

methodit/s?s/it% slower
uuid.uuid4()4530432.2070.0%
uuid0.generate()3111843.21431.31%
uuid.uuid1()2301634.34549.2%

在数据库性能方面,索引大约小于18%。 在postgresql上插入一个uuid类型列的速度提高了23%,但是ymmv 取决于您的用例。

许可证

这个项目是由麻省理工学院授权的。请参阅LICENSE文件 细节。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
jstl中循环内部的java方法   java如何以编程方式查找iOS应用程序的堆内存?   java JPA列注释   http Java在Web浏览器中显示HttpResponse的内容   ssl Java如何接受我的自签名证书而不必将其添加到Java信任库   java解析bufferedReader数据,在某些字符处停止   java将具有多个属性的对象映射到另一个对象,然后收集到列表   java是否可以将抽象方法的返回类型设置为与类相同?   java Android导航抽屉,带有菜单图标而非后退按钮   如何在JavaSpringMVC中防止会话重放攻击?   是VB。NET SmtpClient API受限于Java SendMail?   跨多线程/节点的java会话管理   来自Eclipse的java maven项目   使用已解析Java DOM XML中的元素添加新元素