为了解决分布式 ID 唯一不重复性,twitter 开源了 snowflake 算法,并被众多的企业作为参照,实现自己的一套 ID 生成器。SnowFlake的优点是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由数据中心ID和工作机器ID作区分)
先来一张 twitter 的一张算法图。
接下来大概讲一下雪花算法,主要有以下几部分组成
1, 首位代表符号位。0 为正,1位负,而在生成的 ID 中, 要求基本都是正数, 所以首位基本是0.
2,41位的时间戳。用来记录当前时间与标记时间twepoch的毫秒数的差值,JAVA 应用中是长度13的 Long 型时间戳, 一共41位。计算下来大可以使用69年(T = (1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69。在这里设置twepoch=1485882061743L ,(时间为2017-01-01 01:01:01)。
3,5位数据中心 ID, 及5位工作机器 ID。 这里可以解决分布式 标志性问题。支持2的10次方台机器。数据中心和工作机器 ID 取值均为(0~31)
4, 12位序列号。每个节点每毫秒(同一机器,同一时间截)产生4096个ID序号(1L << 12)
代码连接 >