通用唯一词汇排序标识符
ulid-p的Python项目详细描述
=====
"python"中的"通用唯一词汇排序标识符"https://github.com/alizain/ulid>;`;https://www.python.org/>;`\uu.
状态
~~~~~
此项目是主动维护的。
代码::bash
$pip安装ulid py
代码::bash
$git clone git@github.com:ahawker/ulid.git
$cd ulid&;python setup.py install
usage
~br/>
创建一个全新的ulid。
timestamp值(48位)来自
`time.time()<;https://docs.python.org/3/library/time.html?highlight=time.time time.time>;`
具有毫秒精度。
随机值(80位)来自
`os.urandom()<;https://docs.python.org/3/library/os.html?highlight=os.urandom os.urandom>;`.
…python
>gt>gt>gt;import ulid
>gt>gt>ulid.new()
<;ulid('01bjqe4qqqthmfp0s5j153xxxfsp9')>;
>从现有的128位值(如
`uuid<;https://docs.python.org/3/library/uuid.html>;``uuid.html>;
>支持ulid值为``int````````````````````````````字节`````````````"str",和"uuid"类型。
…导入ulid,uuid,uuid
>
>>>;value=uuid.uuid4()
>>;
>>;>value
>uuid('0983d0a2-ff15-4d83-8f37-7dd945b5b5aa39')
>>>;ulid。from;ulid(value)
<;ulid('09gf8a5zra5a5b5b5b5b5a39')
>
>>>;新建ulid,uuid,uuid,uuid,uuid,uuid
>;
>>>
>>>
>>>>新建一从现有的时间戳值,例如,
`datetime<;https://docs.python.org/3/library/datetime.html module datetime>;``uuu
对象。
<;ulid.from-timestamp(datetime.datetime(1999年1月1日,1999年1月1日))
<;ulid('00tm9hx0008s220a3pwsfvnffeh')>;
>python
>;import datetime,ulid
<;ulid('00tm9hx000080008s220a320a3a3pwsfnffeh')
>
>支持从现有随机值中新建一个ulid值,如"int````int`````````````````拉伊`,`` memoryView`````随机性``和``ulid``类型。
…代码::python
>;>;导入os,ulid
>;>;随机性=os.urandom(10)
>;>;ulid.from廑随机性(随机性)
>;>;ulid('01bjqhx2xedk0vn0gmywt9jn8s')>;
您可以使用"parse"方法,该方法将尝试为您做出正确的决定。请注意,这将比从相应的
``from*``方法创建实例稍微慢一点,因为它需要进行许多类型/条件
检查。
代码::python
>;>import ulid
>;>value=db.model.get_id()不确定数据类型--可以是int、uuid或string?
>;>ulid.parse(value)
>;>lt;ulid('0k0edfetfm8sh912dbbd4abxsz')>;
有很多种方法可以与它交互。
代码::python
>;>;导入ulid
>;>;u=ulid.new()
>>;u
<;ulid('01bjqm7sc7d5vvvvtg3j68abfq3nj68abfq3n')>;
>;u.timestamp()
<;timestamp('01bjqm7sc7')>;
>;u.randominness()
<;randominness('d5vvtg3j68abfq3nj68abfq3n')>;
>ulid``,``timestamp``,``timestamp`,`,是的"randominess"类都派生自同一基类,即"memoryView"。
a"memoryView"提供用于更改任何值表示的"str"、"int"和"bytes"方法。代码::python
>;>;导入ulid
>;>;u=ulid.new()
>;>;u
<;ulid('01bjqmf54d093xeawz6jyrpaq')>;
>;>;u.timestamp()
<;timestamp('01bjqmf54d')>;
>;u.timestamp().int
1499758939322893
>>>;u.timestamp().bytes
b'\x01\\xafg\x94\x8d'
>>;u.timestamp().datetime
datetime.datetime.datetime(2017、6、6、16、5、5、2、2、893000)
>;u.randominness().bytes
b'\x02f\xde\x09\x09\xa5\xecyw'
b'>>b'\x02f\xde\xde\xde\x09\x09\x09\x09\x09\xx09\xa5\xxxxx是的>>gt;u.bytes[6:]==u.randominess()。bytes
true
>>u.str
'01bjqmf54d093dxeawz6jyrpaq'
>;>;u.int
1810474399624548315999517391436142935
a``memoryView``还提供了丰富的比较功能。
代码::python
>;>;导入datetime,time,ulid
>;>;u1=ulid.new()
>;>;time.sleep(5)
>;>;u2=ulid.new()
>;>;u1<;u2
>;true
>;u3=ulid.from_timestamp(datetime.datetime(2039,1,1))
>;>u1<;u2<;u3
true
>;[u.timestamp().datetime for u in sorted([u2,u3,u1])
[datetime.datetime(2017,6,16,5,7,14,847000),datetime.datetime(2017,6,16,5,7,26,775000),datetime.datetime(2039,1,1,8,0)]
未来项目
~~~~~~~~~~~~~~
-跟踪性能的基准集。
-返回python 2.7?
-有关
更多信息,请参阅"github问题"https://github.com/ahawker/ulid/issues>;`!
目标
~~~
使用纯python快速实现规范,支持二进制格式
贡献
~~~~~~~~~~~~
如果您想贡献,只需分叉存储库,推动
更改并发送拉取请求。拉取请求将通过rebase和快进合并进入
``master``分支,目标是
具有线性分支历史记录且无合并提交。
——
uuid在许多情况下可能是次优的,因为:
-它不是编码128位
随机性的最有效的方式
-uuid v1/v2在许多环境中都是不切实际的,因为它需要访问一个唯一、稳定的mac地址
-uuid v3/v5需要一个唯一的种子,并生成随机分布的
id,这可能导致许多数据结构中的碎片
-uuid v4提供的除了随机性之外没有其他信息,随机性可能导致
许多数据结构中的碎片
ulid提供:
-128位与uuid的兼容性
-1.21e+每毫秒24个唯一的ulid
-字典排序!
-规范编码为26个字符的字符串,与36
字符uuid
-使用crockford的base32提高效率和可读性(每个字符5位
)-不区分大小写
-没有特殊字符(url安全)
在这个
存储库中实现。
48位80位
如果可能,必须首先对最左边的字符排序,最后对最右边的字符排序(词法顺序)。必须使用默认的ascii字符集
。在同一毫秒内,不能保证排序顺序
编码
~~~~~~~~~~
::
<0123456789abcdefghjkmnpqrstvwxyz
每个组件的编码均以
最重要字节优先(网络字节顺序)进行。
:
0 1 2 3
0 1 2 3 4 5 7 8 9 0 1 2 3 5 6 7 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 32_bit_uint_time_high |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 16_bit_uint_time_low | 16_bit_uint_random |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
32位单元随机
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
32位单元随机
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字符串表示
~~~~~~~~~~~~~~~~~~~~~~~~~
:
ttttttttttttttttttrrrrrrrr
实现
(javascript)<;https://github.com/alizain/ulid>;`\uU
-`ulid(python)<;https://github.com/mdipierro/ulid>;`\uU
……|构建状态图像::https://travis-ci.org/ahawker/ulid.svg?branch=master
:目标:https://travis ci.org/ahawker/ulid
…|构建状态图像::https://ci.appveyor.com/api/projects/status/fy0hufnb8h6gwk4d/branch/master?svg=true
:目标:https://ci.appveyor.com/project/ahawker/ulid/branch/master
。| codecov图像::https://codecov.io/gh/ahawker/ulid/branch/master/graph/badge.svg
:目标:https://codecov.io/gh/ahawker/ulid
。|编码气候图像::https://codeculate.com/github/ahawker/ulid/badges/gpa.svg
:目标:https://codeculate.com/github/ahawker/ulid
。|问题计数图像::https://codeculate.com/github/ahawker/ulid/badges/issue_count.svg
:目标:https://codeculate.com/github/ahawker/ulid
。| pypi版本image::https://badge.fury.io/py/ulid py.svg
:目标:https://badge.fury.io/py/ulid py
…| pypi版本image::https://img.shields.io/pypi/py versions/ulid py.svg
:目标:https://pypi.python.org/pypi/ulid py
…|更新图片:https://pyup.io/repos/github/ahawker/ulid/shield.svg
:目标:https://pyup.io/repos/github/ahawker/ulid/
。|文档状态图像::https://readthedocs.org/projects/ulid/badge/?version=latest
:目标:http://ulid.readthedocs.io/en/latest/?徽章=最新的
…|图片中的故事:https://badge.waffle.io/ahawker/ulid.svg?label=ready&title=ready
:目标:http://waffle.io/ahawker/ulid