亚麻id算法的python实现

python-flax-id的Python项目详细描述


#亚麻id

亚麻id是一种生成唯一分布式id的算法,在ezhome inc.


概念上它属于"薄片id"算法家族。

[http://yellerapp.com/posts/2015-02-09-flake-ids.html](http://yellerapp.com/posts/2015-02-09-flake-ids.html)

完全分布,无需协调
2。生成唯一的ID,概率非常高
3。生成可以根据创建时间大致排序的id
4。ids有一个很好的字符串表示
5。在不同语言和平台上的工作原理相同

存在多个实现,但并非所有实现都满足上述条件,
实现的细节差别很大(最明显的是数据的长度和组成)。我们找不到在不同语言中以相同方式实现的解决方案。


考虑的一些候选方案:

*python:[simpleflake](https://github.com/sawdustsoftware/simpleflake)
*javascript:[flake-idgen](https://www.npmjs.com/package/flake-idgen)


因此,我们决定编写自己的算法,这给我们带来了以下好处:


1。我们控制id生成的精确参数(例如比特长度)
2。我们可以非常精确地描述算法,这使得用不同语言编写
实现变得简单,与试图破译算法创造者的意图相反,我们在本文中发现了这种方法的灵感(并得到了一些验证)由firebase提供:
[2^120种确保独特性的方法标识符](https://www.firebase.com/blog/2015-02-11-firebase-unique-identifiers.html)



时间戳和
接下来的56位是随机的。
这给出了每毫秒2^56个可能的唯一id。


选择96是基于以下理由:


1。它可以被6整除,因此可以呈现为base64编码的字符串,而不需要
padding
2。它可以被8整除,因此可以表示为字节数组
3。它为随机部分留出了足够的空间

我们通过使用自定义epoch start
(我们从2015-01-01开始)在时间戳组件上节省了一些空间,这允许我们使用40位,而不是42 to
表示未来30+年的时间戳。




这里是示例id的结构:

|随机性
40 56

(当时间戳中少于40位时,需要填充,例如,自纪元
以来经过的时间仍然相对较小)

k j c x q v b i a i q r 0

由此产生的字符串的
有保证的词典顺序(firebase不
相同)


"-0123456789abcdefghijklmnopqrstuvxyz_abcdefghijklmnopqrstuvwxyz"

\取一个时间戳,作为
epoch
2开始后的毫秒数。通过左二进制移位与56个随机位合并。将数字表示为二进制字符串,必要时应用填充,因此
总位数为96
4。使用上面的base64字母对二进制字符串进行编码,每个6位表示一个数字



你需要的新版本,

1.根据
`flax\u id/\u init\uu.py`文件中的[semver](http://semver.org/)来增加版本号,并将日志放入
2下面的*changelog*部分。等待您的代码在Circle CI&;Merged to`Master`
3上测试。创建版本号为"vx.y.z"的新git标记,并将其推送到remote
4。将新版本发布到pypi





git-tag-a vx.y.z-m'x.y.z.x.y.z release
git-push-tags













































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

推荐PyPI第三方库


热门话题
如何在Eclipse中设置Java路径,以便在外部驱动器上运行它?   在windows上使用Java服务包装器GUI与桌面交互   java是与此字符序列不匹配的正则表达式   java无法使用kafka管理客户端API创建具有所需分区的kafka主题   java基于单个单元格值获取整个excel行   当使用Spring的构造函数注入时,java bean是否在构造函数中完全初始化?   java重置LineNumberReader的计数器   将字符串从Java文件传递到jQuery   安卓在来自不同Java类文件的活动中祝酒   java在使用mvvm时如何在zk中更新progressmeter   使用regex获取由“”Java包围的值   使用tester类的java猜谜游戏   api响应的java POJO,其密钥为“”   java正则表达式,用于匹配长度大于n的字母和数字字符串?   java如何使用Json保存和恢复RecyclerView项的位置   在Java中用字符代码替换字符串   Jenkins中的java PermGen错误   java swing panel问题   boolean在Java中,false如何可能等于true   java如何使用Servlet从HTML表单中检索“分组”项?