2017-04-06 34 views
2

我需要以分布式方式生成唯一的ID。一些在服务器端,另一端在客户端。服务器端编程语言可以是Ruby和Python而客户端是JavaScript。 我计划为各自的语言使用simpleflake库。是不同的语言生成的simpleflake ID是否一致?

我可以认为ID不会碰撞?

或者由于不同软件包中的实现细节,它们会经常发生碰撞?

在此先感谢。

-Amit

回答

1

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

简单的鳞片生成ID与formula

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时期。

2

我没有用过Simpleflake本身,而是一直在使用类似的计划了多年,虽然我使用128位而不是64

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

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

+0

谢谢。我现在也会假设跨语言使用这些库是安全的。如果我找到更多信息,我也会在这里发布。 –

相关问题