用不同语言编写的simpleflake id是否一致?

时间:2017-04-06 07:08:29

标签: javascript python uniqueidentifier distributed-system

我需要以分布式方式生成唯一的ID。一些在服务器端,另一个在客户端。服务器端编程语言可以是ruby和python,而客户端是javascript。 我打算为各自的语言使用simpleflake库。

我可以假设ids永远不会碰撞吗?

或者由于不同包中的实现细节,它们经常会发生冲突?

提前致谢。

-Amit

2 个答案:

答案 0 :(得分:1)

我没有使用Simpleflake本身,但多年来一直使用类似的方案,虽然我使用的是128位而不是64位。

关键因素是大部分比特都是随机的。因此,即使您的库为时间戳部分选择稍微不同的位数,或者不同的粒度,则碰撞的可能性也很低。当然,在这种情况下,它会降低数据库的速度。

我认为一些Simpleflake实现是“标准的”,其他实现是直接端口---保持兼容性和特性。如果没有,那么在他们的名字中使用 Simpleflake 就会感到羞耻。

答案 1 :(得分:1)

Python的Simpleflake和Node.js的simpleflakes实际上是从同一个来源(python的实现)派生的。两者都生成64位ID,并且两者生成的ID彼此兼容。

简单的flake使用formula

生成id
flake = (int((time.time() - 946702800) * 1000) << 23) + random.SystemRandom().getrandbits(23)

正如前面的回答所指出的,碰撞概率非常低(这是毫秒 41位时间戳冲突的可能性以及 随机生成23位整数的概率 )。

但是,了解上述两种实现之间的区别非常重要。 simpleflakes node.js库在2000-01-01T00:00:00.000Z处修复其纪元,而python实现在2000-01-01T05:00:00.000Z处假定纪元。