我需要以分布式方式生成唯一的ID。一些在服务器端,另一个在客户端。服务器端编程语言可以是ruby和python,而客户端是javascript。 我打算为各自的语言使用simpleflake库。
我可以假设ids永远不会碰撞吗?
或者由于不同包中的实现细节,它们经常会发生冲突?
提前致谢。
-Amit
答案 0 :(得分:1)
我没有使用Simpleflake本身,但多年来一直使用类似的方案,虽然我使用的是128位而不是64位。
关键因素是大部分比特都是随机的。因此,即使您的库为时间戳部分选择稍微不同的位数,或者不同的粒度,则碰撞的可能性也很低。当然,在这种情况下,它会降低数据库的速度。
我认为一些Simpleflake实现是“标准的”,其他实现是直接端口---保持兼容性和特性。如果没有,那么在他们的名字中使用 Simpleflake 就会感到羞耻。
答案 1 :(得分:1)
Python的Simpleflake和Node.js的simpleflakes实际上是从同一个来源(python的实现)派生的。两者都生成64位ID,并且两者生成的ID彼此兼容。
简单的flake使用formula
生成idflake = (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处假定纪元。