关于程序员:雪花算法

原理

Twitter的雪花算法SnowFlake,应用Java语言实现。

SnowFlake算法产生的ID是一个64位的整型,构造如下(每一部分用“-”符号分隔):

0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000

1位标识局部:在java中因为long的最高位是符号位,负数是0,正数是1,个别生成的ID为负数,所以为0;

41位工夫戳局部:这个是毫秒级的工夫,个别实现上不会存储以后的工夫戳,而是工夫戳的差值(以后工夫-固定的开始工夫),这样能够使产生的ID从更小值开始;41位的工夫戳能够应用69年,(1L << 41) / (1000L 60 60 24 365) = 69年;

10位节点局部:Twitter实现中应用前5位作为数据中心标识,后5位作为机器标识,能够部署1024个节点;

12位序列号局部:反对同一毫秒内同一个节点能够生成4096个ID;

SnowFlake算法生成的ID大抵上是依照工夫递增的,用在分布式系统中时,须要留神数据中心标识和机器标识必须惟一,这样就能保障每个节点生成的ID都是惟一的。或者咱们不肯定都须要像下面那样应用5位作为数据中心标识,5位作为机器标识,能够依据咱们业务的须要,灵便调配节点局部,如:若不须要数据中心,齐全能够应用全副10位作为机器标识;若数据中心不多,也能够只应用3位作为数据中心,7位作为机器标识。

snowflake生成的ID整体上依照工夫自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和workerId作辨别),并且效率较高。据说:snowflake每秒可能产生26万个ID。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理