小背景:我们的订单编号要求是 16 位,改造了一下雪花算法
*
* 参考Twitter Snowflake算法,按实际需求,做了部分修改,结构如下(每部分用-分开):
* 0000000000 - 10000000000000000000000000000000000000000 - 00 - 000 - 00000000
* 10位不使用,因为目的是为了最终生成16位整数,所以只使用后面的54bit
* 41位时间截(毫秒级),存储时间截的差值(当前时间截 - 开始时间截),41位的时间截,可以使用69年,且考虑到差值较小时,会生成不足16位的数字,因些需要选择一个合适的值
* 2位的集群ID,可以部署在4个集群
* 3位的节点ID,每个集群可以有8个节点
* 8位序列,毫秒内的计数,支持每个节点每毫秒产生256个ID序号
* 加起来刚好64位,为一个Long型
*/public class UniqueIdWorker {
/**
* 起始时间,用于调整位数
* 这里取值 2012-12-22 00:00:00
* 以41位表示毫秒,此方案可以使用到 2082-08-28 15:47:35,订单编号从15开头,
*/ private final long baseTimestamp = 1356105600000L;
/**
* 机器id所占的位数
*/
private final long workerIdBits = 3L;
/**
* 集群id所占的位数
*/
private final long clusterIdBits = 2L;
/**
* 支持的最大机器id
*/ private final long maxWorkerId = -1L ^ (-1L << workerIdBits);
/**
* 支持的最大集群id
*/ private final long maxClusterId = -1L ^ (-1L << clusterIdBits);
/**
* 序列在id中占的位数
*/
private final long sequenceBits = 8L;
/**
* 机器ID向左移位数
*/
private final long workerIdShift = sequenceBits;
/**