不同语言生成的simpleflake id是否一致?

Are simpleflake ids generarated in different languages consistent?

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

我可以假设 id 永远不会冲突吗?

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

提前致谢。

-阿米特

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

关键因素是大多数位都是随机的。因此,即使您的库为时间戳部分选择的位数略有不同,或者选择不同的粒度,发生冲突的可能性也很低。当然,在这种情况下,它会降低数据库的速度改进。

我想一些 Simpleflake 实现是 "standard" 而其他实现是直端口——保持兼容性和特性。如果不是,请为他们在他们的名字中使用 Simpleflake 感到羞耻。

Python 的 Simpleflake and Node.js's 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。