一、简介
在很多业务场景中,在单台机器或者由多台机器构成的分布式场景中,我们需要生成全局唯一的id。
在这里,将介绍基于twitter的雪花算法,生成全局的、唯一的、基于时间排序的、基本有序的id生成方法。
二、twitter雪花算法的原理
twitter的雪花算法,是将id按二进制比特位切割,不同的位区间,表示不同的含义,也即是不同位区间
的值生成方式不同,从而生成唯一的id。
如位区间可分为时间位区间、集群位区间、机器位区间、自增位区间,这样可在不同时间内、不同集群、
不同机器间,生成全局唯一的id。
三、twitter雪花算法的实例
在此以生成64位(即long型)为例进行介绍(其实区间位可以根据具体的业务需要自行指定)。
1、位区间化分
最高位(即第64位,从右向左数)为符号位,不使用;
41位(第23位到第63位)为时间位,可使用个数为2199023255551个,以毫秒为单位,大约69.5年;
5位(第18位到第22位)为集群位,可使用个数为32个;
5位(第13位到第17位)为机器位,可使用个数为32个;
12位(第1位到第12位)为序列号位,即是从0开始自增,可使用个数为4096个;
2、确定时间位开始计算的时间点
本例以2017-10-12 00:00:00开始计时,那么过去掉的时间(从1970-01-01 00:00:00开始)的毫秒数
为1507737600000,取时间时需要减去这段时间。
四、代码实例
/** * 采用twitter的雪花算法,生成有一定顺序且不重复的id,结果类型为64位的long型 */ public class SnowflakeIdGen { //集群id private long datacenterId; //机器id private long workerId; //序列号 private long sequenceId; //集群id的bit位数 private long datacenterIdBits = 5L; //机器id的bit位数 private long workerIdBits = 5L; //序列号的bit位数 private long sequenceIdBits =