原理
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。
发表回复