雪花算法应用于分布式生成有序的全局唯一性ID,由64个bit位组成。
第一个部分,是1个bit:0,因为ID默认为整数,符号位为0代表为整数。
第二个部分,是41个bit:表示的是时间戳,单位是毫秒(ms),2^41-1ms等于69年
第三个部分,是5个bit:表示为机房ID
第四个部分,是5个bit:表示为机器ID
第五个部分,是12个bit:表示的是序号,2^12-1=4095
整体含义为:某一时刻(第二部分),在某一机房 (第三部分),在某一机器(第四部分),生成的ID序号(第五部分)
算法伪代码:
获取当前时间戳 a
if(a < 上一次的时间戳)
抛出异常
if(a == 上一次的时间戳)
/**
*代表是同一毫秒内的生成的雪花ID
*当后12位bit生成到序列号为最大值4095时
*源码中使用的是 sequence=(sequence+1)& MAX_SEQUENE
* sequence为当前序列号 MAX_SEQUENE为序列号最大值4095 此处都为二进制表示
*/
if(sequence == 0L)
获取下一个时间戳,赋值给当前时间戳
else
序列号sequence 设置为0L
//最后 通过位运算 将各个部分组装起来
时钟回拨问题:
1.使用懒惰解决办法,等待<5ms的时间,再进行生成
2.备份服务器的使用