为数据库和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第三方库


热门话题
java组在不同线程中记录消息   java Wicket挂载404错误页   Java:如何制作对象数组的副本?   类似Windows中的java日期时间选择器   java无法获取JTextField用户输入以搜索文本文件   安卓 Java:如何随机更改背景和字体颜色   Java定时器中的摆动变化延迟   java让Selenium暂停X秒   将响应传递到视图时发生java Nativescript错误   java刷新安卓列表视图的最佳方式是什么?   单java进程的多线程队列/工作线程体系结构   web服务Java NoSuchMethodException   java groupingBy和filter一步到位   java游标。getCount()给定错误   即使引用的文件位于项目根目录中,java PrintWrite仍会持续引发“未找到文件”异常