不跟你多BB,上张图好说话
为什么 是64位呢,因为返回值是long类型是64位,但是第一位是符号位不可用,所有只剩下63位
时间戳的长度,决定了该算法使用的年限,时间戳记录的不是当前时间戳,而是当前时间戳和和起始时间戳的差值,起始时间戳由程序员自己设置
41位 按如下公式计算可用时间约为 (1L << 41) / (1000L * 60 * 60 * 24 * 365) = 49 年 ,可根据实际情况控制 工作机器id 的长度
序列号位数决定了当前毫秒,当前机器能产生的最多订单号 2^12 = 4096 个
工作机器id 的长度决定了能支持同时多少台机器使用 2^10 = 1024
/**
* @author wcn
* @date 2019/12/23 17:09
*/
public class SnowFlakeUtil {
/**
* 起始的时间戳
*/
private final static long START_STMP = 1480166465631L;
/**
* 序列号占用的位数 每一部分占用的位数,就三个 最大值为:2^12 = 4095
*/
private final static long SEQUENCE_BIT = 12;
/**
* 机器标识占用的位数 最大值为:2^5 = 31
*/
private final static long MACHINE_BIT = 5;
/**
* 数据中心占用的位数 最大值为:2^5 = 31
*/
private final static long DATA_CENTER_BIT = 5;
/**
* 每一部分最大值
*/
private final static long MAX_DATA_CENTER_NUM = -1L ^ (-1L << DATA_C