SnowFlake(雪花算法)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SnowFlake(雪花算法)相关的知识,希望对你有一定的参考价值。

参考技术A 首先雪花算法就是生成一个64位的二进制数据,最终转换成长度为19的十进制正整数整型数据

解释一下这64位分别代表什么意思,从左往右。

当然这个算法的强大并不仅仅如此而已,这个算法的时间位、机器位、序列号位都是可以根据不同场景来调整的,那么他们碰撞的几率也随着调整发生改变。

接下来上干货

总体来说算法并不难,思路清晰,其中的牵扯到的知识点就是各个数据间进行位运算,这块知识薄弱的可以去补一补。
一篇文档不仅get到了雪花算法的思想,还发现了就像当初发现随机函数 Random 一样,随机只是在一定范围内随机,唯一只是在某一个时间段唯一。场景是度量算法的尺度,致敬 Twitter 。

雪花算法(SnowFlake)

参考技术A 解决方法:

首先,SnowFlake的末尾12位是序列号,用来记录同一毫秒内产生的不同id,同一毫秒总共可以产生4096个id,每一毫秒的序列号都是从0这个基础序列号开始递增。假设我们的业务系统在单机上的QPS为3w/s,那么其实平均每毫秒只需要产生30个id即可,远没有达到设计的4096,也就是说通常情况下序列号的使用都是处在一个低水位,当发生时钟回拨的时候,这些尚未被使用的序号就可以派上用场了。
因此,可以对给定的基础序列号稍加修改,后面每发生一次时钟回拨就将基础序列号加上指定的步长,例如开始时是从0递增,发生一次时钟回拨后从1024开始递增,再发生一次时钟回拨则从2048递增,这样还能够满足3次的时钟回拨到同一时间点。

改变原来的末尾sequence生成方法:

snowflake算法给workerId预留了10位,即workId的取值范围为[0, 1023],事实上实际生产环境不大可能需要部署1024个分布式ID服务,所以:将workerId取值范围缩小为[0, 511],[512, 1023]这个范围的workerId当做备用workerId。workId为0的备用workerId是512,workId为1的备用workerId是513,以此类推……

以上是关于SnowFlake(雪花算法)的主要内容,如果未能解决你的问题,请参考以下文章

雪花算法原理介绍及基于php的雪花算法(snowflake)

php雪花算法SnowFlake生成唯一ID

ID生成算法-雪花算法(SnowFlake)及代码实现

雪花算法SnowFlake

SnowFlake 雪花算法详解与实现

snowflake 雪花算法 唯一ID