【雪花算法】

雪花算法

package com.shaoby.common.utils;import com.shaoby.common.enums.ExceptionEnum;
import com.shaoby.common.exception.ApiException;import java.time.*;
import java.util.*;
import java.util.concurrent.CountDownLatch;/*** 雪花算法生产64位全局唯一ID* 1位符号位* 41位存储时间戳* 5位存储机器ID* 5位存储服务ID* 12位自增序列号* @Author Cookie* @Date 2024/6/23 1:12*/
public class SnowFlakeUtils {//机器ID,暂时写死private long workerid = 0;//服务ID,暂时写死private long serviceid = 0;//2024-01-01 00:00:00时间戳private final long basicTime = 1704038400000L;//机器ID所占的位数private final long workerIdBits = 5L;//服务ID所占位数private final long serviceBitId = 5L;//机器ID最大值,用于校验机器IDprivate final long maxWorkIdBit = -1 ^ (-1 << workerIdBits);//服务ID最大值,用于校验服务器IDprivate final long maxServiceIdBit = -1 ^ (-1 << serviceBitId);//序列在ID中占的位数private final long sequenceBits = 12L;//机器ID左移12位;private final long workerIdShift = sequenceBits;//服务ID左移17位private final long serviceIdShift = sequenceBits + sequenceBits;//时间戳左移22位private final long timeShift = sequenceBits + sequenceBits + workerIdBits;//毫秒内最大序列号private final long maxSequence = (-1L) ^(-1 << sequenceBits);//毫秒内序列private long sequence = 0L;//上次生成序号时间戳private long lastTimestamp = 0L;public synchronized long getNextId(){//当前时间戳long timestamp = timeGen();//时间回溯抛异常if(timestamp < lastTimestamp){throw new ApiException(ExceptionEnum.TIME_BACK_ERROR);}//如果是毫秒内生成sequence+1if(timestamp == lastTimestamp){/*** 当毫秒内生成的序列号没有超过最大值时候,直接加一,* 如果超过了最大值会溢出,十二位不够存储,比如 1111 1111 1111 1111再加一回多一位变成 1 0000 0000 0000,* 这里这样处理:去 & 上一个最大值,* 如果超过了最大值,即 1 0000 0000 0000 &  1111 1111 1111 变成 0000 0000 0000* 如果没有超过最大值,如 1111 0000 0000 & 1111 1111 1111 还是 1111 0000 0000,不变*/sequence = (sequence+1) & maxSequence;/** 如果为0表示超过了最大值,则放到下一毫秒生成*/if(sequence == 0L){timestamp = nextTimeGen(timestamp);}}else {sequence = 0;}lastTimestamp = timestamp;return ((timestamp-basicTime) << timeShift) | (workerid << workerIdShift) | (serviceid << serviceIdShift) | sequence;}/** 获取当前时间戳*/private long timeGen() {return System.currentTimeMillis();}/** 获取下一毫秒时间戳*/private long nextTimeGen(long time){//拿到当前时间戳long timeStamp = timeGen();//如过还在当前毫秒内,重新获取当前时间,只到拿到非当前毫秒内时间戳while (time <= timeStamp){timeStamp = timeGen();}return timeStamp;}public static void main(String[] args) throws InterruptedException {SnowFlakeUtils snowFlakeUtils = new SnowFlakeUtils();Set<Object> set = Collections.synchronizedSet(new LinkedHashSet<>());int threadCount = 500;CountDownLatch latch = new CountDownLatch(threadCount);for (int i = 0; i < threadCount; i++) {new Thread(() -> {long nextId = snowFlakeUtils.getNextId();System.out.println(Thread.currentThread().getName() +"--->"+ nextId);set.add(nextId);latch.countDown();}).start();}latch.await();System.out.println(set.size());}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/858060.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何解决代码中if…else-过多的问题,建议收藏

逻辑表达模式固定的 if…else 实现与示例 if (param.equals(value1)) { doAction1(someParams); } else if (param.equals(value2)) { doAction2(someParams); } else if (param.equals(value3)) { doAction3(someParams); } // … 可重构为 Map<?, Function<?>…

【会议征稿,CPS出版】第四届管理科学和软件工程国际学术会议(ICMSSE 2024,7月19-21)

第四届管理科学和软件工程国际学术会议(ICMSSE 2024)由ACM珠海分会&#xff0c;广州番禺职业技术学院主办&#xff1b;全国区块链行业产教融合共同体&#xff0c;AEIC学术交流中心承办&#xff0c;将于2024年7月19-21日于广州召开。 会议旨在为从事管理与软件工程领域的专家学…

CentOS 6是什么意思

CentOS 6 是 CentOS 项目的一个主要版本。CentOS&#xff08;Community ENTerprise Operating System&#xff09;是一个基于开源的 Linux 发行版&#xff0c;它主要从源代码构建自 Red Hat Enterprise Linux&#xff08;RHEL&#xff09;。CentOS 6 代表了该操作系统的第六个主…

Type-C连接器厂商对检测实验室的要求及重要性解析

Type-C连接器厂商对检测实验室的要求与重要性 Type-C连接器作为一种高速、全功能的接口标准&#xff0c;被广泛应用于各类电子产品中。作为Type-C连接器的制造商&#xff0c;对于产品的质量和性能要求是至关重要的。为了确保产品符合规范并满足市场需求&#xff0c;Type-C连接…

应用篇| 深入浅出LLM应用之RAG

相信很多人都使用过LLM大模型&#xff0c;但是现有大模型或多或少都有以下问题&#xff1a; LLM幻觉问题&#xff1a;从《【小白入门篇1】GPT到底是怎样练成&#xff1f;》我们知道虽然大模型现在能力很强,但是本质就是在做文字接龙,而且每次接龙都具有随机性, 导致模型有时候…

vb6中for循环怎么写

在 VB6 中&#xff0c;for 循环可以使用以下语法来编写&#xff1a; For counter start To end [Step stepValue] 循环体代码 Next [counter]其中&#xff1a; counter是循环计数器变量&#xff0c;它在循环过程中逐步递增或递减。 start是计数器变量的初始值。 end是计数器…

EtherCAT数据包抓取(wireshark)

目录 1、twincat配置 2、选择正确的网卡 3、过滤条件示例 (1) 过滤逻辑读的数据帧 (2) 过滤邮箱等配置数据 (3) 抓取读EtherCAT状态的数据帧 1、twincat配置 勾选 Device2->Adapter->Promiscuous Mode&#xff0c;重新激活配置。 2、选择正确的网卡 3、过滤条件示…

图(数据结构篇)

数据结构之图 图 概念&#xff1a; 一个图(graph)G(V,E)由顶点集V和边集E组成&#xff0c;每一条边就是一个点对(u,w)&#xff0c;其中u&#xff0c;w∈V&#xff0c;有时边称作弧&#xff0c;如果点对是有序的&#xff0c;那么组成的图叫做有向图&#xff0c;反之就是无向图…

【C语言】--- 常见调试信息预处理器宏

在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。【C语言】--- 常见调试信息预处理器宏 开发环境一、 `__FILE__`二、`__LINE__`三、 `…

2. 数据结构分析即索引库的crud

1. 数据库脚本 DROP TABLE IF EXISTS tb_hotel; CREATE TABLE tb_hotel (id bigint(0) NOT NULL,name varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT COMMENT 酒店名称,address varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_090…

【推荐100个unity插件之21】unity实现多语言切换功能——Localization插件的使用

文章目录 前言优缺点优点缺点 安装创建配置选择语言选择默认语言创建多语言表数据创建key配置不同语言文本预加载绑定不同多语言文本数据&#xff0c;并显示语言切换自己编写按钮控制语言切换多语言图片切换在构建中使用Localization分析错误修复动态修改多语言文本内容参考推荐…

Django 模版变量

1&#xff0c;模版变量作用 模板变量使用“{{ 变量名 }}” 来表示模板变量前后可以有空格&#xff0c;模板变量名称&#xff0c;可以由数字&#xff0c;字母&#xff0c;下划线组成&#xff0c;不能包含空格模板变量还支持列表&#xff0c;字典&#xff0c;对象 2&#xff0c;…

一文解释IO端口与网络端口

计算机的端口可以分为两类&#xff1a;I/O端口和网络端口。每一类都有其特定的功能和应用。以下是对这两类端口的详细介绍。 I/O端口 定义 I/O端口是用于计算机与外围设备之间通信的接口。每个I/O端口都对应一个唯一的地址&#xff0c;操作系统和程序通过这些地址与设备通信。 …

SWAT模型【建模方法、实例应用、高级进阶技能】

第一部分&#xff1a;SWAT模型实践部分 一 SWAT模型及应用介绍 1.1 面源污染概要 1.2 SWAT模型及应用 1.3 SWAT模型原理 1.4 SWAT模型输入文件 1.5 ArcGIS与SWAT关系 二 SWAT模型中GIS 必备技术 2.1 GIS软件平台 2.2 ArcGIS10.6安…

APP终极瘦身方案

具体可参见 github.com/shwenzhang/… 优化META-INF MANIFEST.MF&#xff1a;是摘要文件&#xff0c;程序会遍历apk包中所有的文件&#xff0c;对非文件夹、非签名文件的文件&#xff0c;逐个编码生成摘要信息&#xff0c;并记录于此。如果逆向修改了任何文件&#xff0c;那么…

(2024.6.23)最新版MAVEN的安装和配置教程(超详细)

1.什么是MAVEN Maven是一个自动化构建工具&#xff0c;主要用于Java项目&#xff0c;它由Apache软件基金会维护。Maven能够自动化完成编译、测试、打包、发布等构建过程&#xff0c;可以大大提高开发效率&#xff0c;保证项目的质量。 下面我们从几个方面来介绍一下MAVEN的功能…

【嵌入式Linux】i.MX6ULL 时钟树——理论分析

文章目录 0. 时钟树结构0.1 参考手册 Chapter 18​: Clock Controller Module (CCM)0.2 时钟信号路径 1. 时钟源——晶振1.1 外部低频时钟 - CKIL1.1.1 CKIL 同步到 IPG_CLK 解释 1.2 外部高频时钟 - CKIH 和 内部振荡器1.3 总结1.4 缩写补充 2. PLL时钟2.1 i.MX6U 芯片 PLL 时…

八爪鱼现金流-025-工作的终极目标,不是为了成为更好的员工

工作的终极目标&#xff0c;不是为了成为更好的员工。 而是解放时间和收入自动化 打造自己的被动收入!!! 八爪鱼现金流 八爪鱼

Docker 如何支持 NVIDIA GPU

Docker 如何支持 GPU Docker 是一个强大的工具&#xff0c;可以帮助开发者构建、部署和运行应用程序。对于需要高性能计算的应用程序&#xff0c;例如机器学习、深度学习和科学计算&#xff0c;利用 GPU 可以大大提升计算效率。本文将详细介绍 Docker 如何支持 GPU 以及如何配…

CMMM Plus+ Calculus Update 超级游戏大作 游戏说明

资源链接 关卡编辑器 ◽️使用 WASD 移动视图。 ◽️LMB 放置单元格。 ◽️Space LMB 删除单元格。Ctrl Space LMB 删除所有相同类型的单元格。 ◽️Q / E 旋转单元格。 ◽️Z / X 在单元格类别之间切换。 ◽️键 1-9 快速选择单元格。 ◽️按 F 显示可拖动的图块。 ⌨️控…