为数据库和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脚本生成):
method | it/s | ?s/it | % slower |
---|---|---|---|
uuid.uuid4() | 453043 | 2.207 | 0.0% |
uuid0.generate() | 311184 | 3.214 | 31.31% |
uuid.uuid1() | 230163 | 4.345 | 49.2% |
在数据库性能方面,索引大约小于18%。 在postgresql上插入一个uuid类型列的速度提高了23%,但是ymmv 取决于您的用例。
许可证
这个项目是由麻省理工学院授权的。请参阅LICENSE文件 细节。