基于Twitter的snowflake(雪花)算法实现全局ID
上一篇 <<<基于UUID算法实现全局ID
下一篇 >>>基于Redis生成全局ID
一般在生成消息任务主键领域使用比较多
snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。其核心思想是:
高位随机+毫秒数+机器码(数据中心+机器id)+10位的流水号码
Snowflake 原理:
snowflake生产的ID是一个18位的long型数字,二进制结构表示如下(每部分用-分开):
0 - 00000000 00000000 00000000 00000000 00000000 0 - 00000 - 00000 - 00000000 0000
第一位未使用,接下来的41位为毫秒级时间(41位的长度可以使用69年,从1970-01-01 08:00:00),然后是5位datacenterId(最大支持25=32个,二进制表示从00000-11111,也即是十进制0-31),和5位workerId(最大支持25=32个,原理同datacenterId),所以datacenterId*workerId最多支持部署1024个节点,最后12位是毫秒内的计数(12位的计数顺序号支持每个节点每毫秒产生2^12=4096个ID序号).所有位数加起来共64位,恰好是一个Long型(转换为字符串长度为18).单台机器实例,通过时间戳保证前41位是唯一的,分布式系统多台机器实例下,通过对每个机器实例分配不同的datacenterId和workerId避免中间的10位碰撞。最后12位每毫秒从0递增生产ID,再提一次:每毫秒最多生成4096个ID,每秒可达4096000个。
推荐阅读:
<<<分布式全局ID生成总览
<<<基于数据库自增方式实现全局ID
<<<基于UUID算法实现全局ID
<<<基于Redis生成全局ID