当前位置: 首页 > 后端技术 > Java

雪花算法

时间:2023-04-02 02:11:42 Java

前言雪花算法是为了解决分布式系统中生成唯一主键的问题而产生的。主键是唯一且增量的。雪花算法1.第一位占1位,其值一直为0,没有实际作用。2、时间戳占41位,精确到毫秒,一共可以保存69年左右。3、工作机id占用10位,最多可容纳1024个节点。4.序号占12位,每个节点每毫秒从0开始累加,最多累加4095个,一共可以生成4096个ID。代码接下来,让我们看一下代码来理解。publicclassSnowflakeIdWorker{/***开始时间截止(2015-01-01)*/privatefinallongtwepoch=1420041600000L;/***机器id占用的位数*/privatefinallongworkerIdBits=5L;/***数据标识符id占用的位数*/privatefinallongdatacenterIdBits=5L;/***最大支持的机器id,结果为31(这个移位算法可以快速计算出几个二进制数可以表示的最大十进制数)*/privatefinallongmaxWorkerId=-1L^(-1L<maxWorkerId||workerId<0){thrownewIllegalArgumentException(String.format("workerId不能大于%d或小于0",maxWorkerId));}if(datacenterId>maxDatacenterId||datacenterId<0){thrownewIllegalArgumentException(String.format("datacenterIdcan'tbegreaterthan%dorlessthan0",maxDatacenterId));}次is.workerId=workerId;this.datacenterId=datacenterId;}/***获取下一个ID(此方法是线程安全的)*@returnSnowflakeId*/publicsynchronizedlongnextId(){longtimestamp=timeGen();//如果当前时间小于上次生成ID的时间戳,说明系统时钟回滚了,应该抛出异常向后。拒绝为%d毫秒生成id",lastTimestamp-timestamp));}//如果同时生成,则在毫秒内排序if(lastTimestamp==timestamp){sequence=(sequence+1)&sequenceMask;//毫秒内序列溢出if(sequence==0){//阻塞到下一毫秒,获取新的时间戳timestamp=tilNextMillis(lastTimestamp);}}//时间戳改变,毫秒内重置序列else{sequence=0L;}//最后一次生成ID的时间lastTimestamp=timestamp;//移位并通过或运算拼在一起,形成一个64位的ID返回n((timestamp-twepoch)<

最新推荐
猜你喜欢