(企业项目)SpringBoot实现雪花算法id注册功能

以下是使用 Spring Boot 实现雪花算法的完整代码。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class SnowflakeGeneratorApplication {public static void main(String[] args) {SpringApplication.run(SnowflakeGeneratorApplication.class, args);}}

import org.springframework.stereotype.Component;@Component
public class SnowflakeGenerator {private final long START_STMP = 1480166465631L;// 每部分占用的位数,注意不能超过63位,即 long 类型的最大位数private final long SEQUENCE_BIT = 12; // 序列号占用的位数private final long MACHINE_BIT = 5; // 机器标识占用的位数private final long DATACENTER_BIT = 5;// 数据中心占用的位数// 每部分最大值private final long MAX_DATACENTER_NUM = -1L ^ (-1L << DATACENTER_BIT);private final long MAX_MACHINE_NUM = -1L ^ (-1L << MACHINE_BIT);private final long MAX_SEQUENCE = -1L ^ (-1L << SEQUENCE_BIT);// 每部分向左的位移private final long MACHINE_LEFT = SEQUENCE_BIT;private final long DATACENTER_LEFT = SEQUENCE_BIT + MACHINE_BIT;private final long TIMESTMP_LEFT = DATACENTER_LEFT + DATACENTER_BIT;private long datacenterId; // 数据中心private long machineId; // 机器标识private long sequence = 0L; // 序列号private long lastStmp = -1L; // 上一次时间戳public SnowflakeGenerator() {this.datacenterId = getDatacenterId(MAX_DATACENTER_NUM);this.machineId = getMachineId(MAX_MACHINE_NUM);}public synchronized long nextId() {long currStmp = getNewstmp();if (currStmp < lastStmp) {throw new RuntimeException("Clock moved backwards.  Refusing to generate id");}if (currStmp == lastStmp) {sequence = (sequence + 1) & MAX_SEQUENCE;if (sequence == 0L) {currStmp = getNextMill();}} else {sequence = 0L;}lastStmp = currStmp;return (currStmp - START_STMP) << TIMESTMP_LEFT //| datacenterId << DATACENTER_LEFT // 数据中心部分| machineId << MACHINE_LEFT // 机器标识部分| sequence; // 序列号部分}private long getNextMill() {long mill = getNewstmp();while (mill <= lastStmp) {mill = getNewstmp();}return mill;}private long getNewstmp() {return System.currentTimeMillis();}/*** 获取 maxDatacenterId*/protected long getDatacenterId(long maxDatacenterId) {long id = 0L;try {InetAddress ip = InetAddress.getLocalHost();NetworkInterface network = NetworkInterface.getByInetAddress(ip);if (network == null) {id = 1L;} else {byte[] mac = network.getHardwareAddress();if (mac != null) {id = ((0x000000FF & (long) mac[mac.length - 1]) | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6;id = id % (maxDatacenterId + 1);}}} catch (Exception e) {System.out.println("get data center id error:" + e.getMessage());}return id;}/*** 获取 maxWorkerId*/protected long getMachineId(long maxWorkerId) {long id = 0L;try {InetAddress ip = InetAddress.getLocalHost();NetworkInterface network = NetworkInterface.getByInetAddress(ip);if (network == null) {id = 1L;} else {byte[] mac = network.getHardwareAddress();if (mac != null) {id = ((0x0000FF & (long) mac[mac.length - 2]) | (0x00FF00 & (((long) mac[mac.length - 1]) << 8))) >> 4;id = id % (maxWorkerId + 1);}}} catch (Exception e) {System.out.println("get machine id error:" + e.getMessage());}return id;}}

使用:

@Autowired
private SnowflakeGenerator snowflakeGenerator;long id = snowflakeGenerator.nextId();

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

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

相关文章

Java 简易版 TCP(一对一)聊天

客户端 import java.io.*; import java.net.Socket; import java.util.Date; import javax.swing.*;public class MyClient {private JFrame jf;private JButton jBsend;private JTextArea jTAcontent;private JTextField jText;private JLabel JLcontent;private Date data;p…

删除有序数组中的重复元素-练习双指针编程最好的一道题-费元星

这是练习编成双指针最好的一道题&#xff0c;逻辑简单&#xff0c;优化简单。 简单理解&#xff1a;采用双指针&#xff0c;总左边进行开始&#xff0c;如果有新元素则将前面移动到后面。然后加一个剪枝操作&#xff0c;如果前后元素大于1&#xff0c;再移动。 给你一个 非严格…

检验科LIS系统源码,临床检验数据的采集、存贮、处理、提取、传输、汇总

检验科LIS系统源码 临床检验信息管理系统是医院信息管理系统的重要组成部分&#xff0c;实现对LIS系统所涉及的人流、物流、财流进行综合管理&#xff0c;对在临床检验活动各阶段中产生的数据进行采集、存贮、处理、提取、传输、汇总、加工生成各种信息&#xff0c;从而为医院的…

freeswitch编译mod_av支持webrtc MCU通话

系统环境 一、FS相关网站 二、第三方库安装 1.apt安装 2.指定版本sofia-sip安装 3.指定版本spandsp安装 4.指定版本libks安装 5.指定版本openssl安装 三、指定版本FS安装 1.CPPFLAGS配置 2.编译器版本 3.FS配置编译 四、FS&#xff0c;fs_cli运行&#xff0c;模块加载 附录 1.安…

word一键接受所有修订并保留修订痕迹

目的&#xff1a;让word修订插入的内容在接受修订后保留痕迹。 文章目录 目的&#xff1a;让word修订插入的内容在接受修订后保留痕迹。1. 打开批注的word文件2. 同时按住&#xff1a;*AltF11*&#xff0c;然后右键&#xff1a;Normal -->插入--> 模块3. 在出现的代码框中…

代码随想录算法训练营第五十九天【单调栈part2】 | 503.下一个更大元素II、42. 接雨水

503.下一个更大元素II 题目链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 求解思路 重点在如何处理循环数组。 方案一&#xff1a; 直接将两个数组拼接在一起&#xff0c;然后使用单调栈求下一个最大值。 方案二&#xff1a; 在遍历的过…

elementUI中的 “this.$confirm“ 基本用法,“this.$confirm“ 调换 “确认“、“取消“ 按钮的位置

文章目录 前言具体操作总结 前言 elementUI中的 "this.$confirm" 基本用法&#xff0c;"this.$confirm" 调换 "确认"、"取消" 按钮的位置 具体操作 基本用法 <script> this.$confirm(这是数据&#xff08;res.data&#xff0…

使用ASIRequest库进行Objective-C网络爬虫示例

在Objective-C中&#xff0c;ASIHTTPRequest是一个非常受欢迎的库&#xff0c;用于处理HTTP请求。它可用于下载网页内容&#xff0c;处理API请求&#xff0c;甚至进行复杂的网络交互。下面是一个简单的示例&#xff0c;展示了如何使用ASIHTTPRequest库来爬取网页代码。 首先&a…

使用项目管理工具进行新媒体运营管理的策略与方法

使用Zoho Projects项目管理工具&#xff0c;新媒体运营可轻松驾驭从策划选题、撰写到排期发布的全流程。运用项目管理工具对新媒体运营进行精细化管理&#xff0c;助力团队更高效地规划、执行和追踪各项任务与活动。 以下是运用项目管理工具管理新媒体运营的妙招&#xff1a; 1…

oracle 下载java之前版本

登录oracle官网&#xff1a;Oracle | Cloud Applications and Cloud Platform 点击resource 进入该页面 点击这个 出现之前版本

初识Linux:权限(2)

目录 权限 用户&#xff08;角色&#xff09; 文件权限属性 文件的权限属性&#xff1a; 有无权限的区别&#xff1a; 身份匹配&#xff1a; 拥有者、所属组的修改&#xff1a; 八进制的转化&#xff1a; 文件的类型&#xff1a; x可执行权限为什么不能执行&#xf…

03DockerFile

03DockerFile 1.DockerFile的概念 用来构建docker​镜像的构建文件,由一系列参数和命令构成的脚本 大体总览: ​​ ‍ 1.构建过程 要遵循的规则: ​​ 2.执行流程 ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍

Java并发编程指南:实现高效并发操作

引言&#xff1a; 在当今的软件开发领域&#xff0c;多核处理器的普及使得并发编程成为了一个重要的话题。并发编程是指多个线程同时执行不同的任务&#xff0c;以提高程序的性能和响应能力。然而&#xff0c;并发编程也带来了一系列的挑战&#xff0c;如线程安全、死锁等问题。…

Docker安装postgres最新版

1. postgres数据库 PostgreSQL是一种开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它是一种高度可扩展的、可靠的、功能丰富的数据库系统。以下是关于PostgreSQL的一些介绍&#xff1a; 开源性&#xff1a;PostgreSQL是一个开源项目&#xff0c;可以…

如何检查代理和防火墙设置

这样的错误可能会突然出现在个人计算机屏幕上&#xff0c;当访问您喜爱的网站时。这是什么原因&#xff0c;如何快速解决这个问题&#xff1f;我们将弄清楚如何检查。 关于访问问题 对网站的访问受阻实际上是一个非常常见的错误&#xff0c;它既可能是由于物理原因&#xff08…

Linux高级管理-搭建网站服务

在Ihternet 网络环境中&#xff0c;Web 服务无疑是最为流行的应用系统。有了Web站点&#xff0c;企业可以充分 展示自己的产品&#xff0c;宣传企业形象。Web站点还为企业提供了与客户交流、电子商务交易平台等丰富 的网络应用。部署与维护Web 服务是运维工程师必须掌握的一个技…

Launcher3 一键改变Icon Shape 原理浅析

Launcher3 一键改变Icon Shape 原理浅析 在Android O Launcher3 Google 团队增加了一个新特性&#xff0c;可以在设置里面更改 桌面Icon 形状&#xff0c;分别可以改为系统默认、方形、方圆形、圆形、泪珠形。 在Android P Launcher3 Google团队继续保持这一神奇特性&#xff0…

python中的下划线

本文介绍了Python中单下划线和双下划线的5种表现形式&#xff0c;以及一些使用方法。其中有一些含义仅仅是依照约定&#xff0c;被视作是对程序员的提示&#xff0c;而有一些含义是由Python解释器严格执行的。 单前导下划线&#xff1a;_var单末尾下划线&#xff1a;var_双前导…

PHP介绍及安装

一、PHP语言介绍 1. PHP是一种用于创建动态交互性网站的服务器端脚本语言。PHP文件通常包含HTML标签和一些PHP脚本代码,这些PHP代码可以放置在文档的任意位置。 2. PHP文件是什么 PHP文件是一种包含有效的HTML、JavaScript代码和PHP代码的文件。PHP代码在服务器上执行,并将…

《网络弹性法案》协议达成,欧盟立法进一步临近实施

欧盟的《网络弹性法案》规定了所有硬件和软件的强制性网络安全要求 《网络弹性法案》&#xff08;CRA&#xff09;是欧洲议会和欧洲理事会就即将实施的重要立法达成的政治协议。该法案于 2022 年 9 月由欧洲委员会首次提出&#xff0c;旨在提高数字产品的网络安全&#xff0c;造…