原理
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。