不同语言生成的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。
我需要以分布式方式生成唯一 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
生成 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。