当前位置: 首页 > news >正文

Require:基于雪花算法完成一个局部随机,全局离散没有热点切唯一的数值Id生成器。

【雪花算法】雪花算法(Snowflake Algorithm)是Twitter开源的用于生成唯一ID的算法,它可以在分布式系统中生成唯一的64位长整数ID。这种ID生成方式既保证了趋势递增,又保证了在不同数据中心、不同机器上生成的ID的唯一性。

  • 符号位:占用1位。

  • 时间戳:通常占用41位,表示从某个固定时间点(如1970年1月1日)起的毫秒数。这使得生成的ID具有时间排序性。

  • 机器ID:占用10位,表示生成ID的机器节点,以确保不同机器生成的ID不冲突。

  • 序列号:占用12位,允许同一毫秒内生成多个ID,通常用于支持高并发。

public class SnowflakeIdGenerator {private static final long EPOCH = 1640995200000L; // 自定义的开始时间戳(2022年1月1日)private static final long MACHINE_ID_BITS = 10L; // 机器ID的位数private static final long SEQUENCE_BITS = 12L; // 序列号的位数private static final long MAX_MACHINE_ID = ~(-1L << MACHINE_ID_BITS); // 机器ID最大值private static final long SEQUENCE_MASK = ~(-1L << SEQUENCE_BITS); // 序列号最大值private long machineId; // 当前机器IDprivate long sequence = 0L; // 当前序列号private long lastTimestamp = -1L; // 上次生成ID的时间戳public SnowflakeIdGenerator(long machineId) {if (machineId > MAX_MACHINE_ID || machineId < 0) {throw new IllegalArgumentException("Machine ID can't be greater than " + MAX_MACHINE_ID + " or less than 0");}this.machineId = machineId;}public synchronized long generateId() {long timestamp = System.currentTimeMillis();// 如果当前时间小于上次生成ID的时间戳,说明系统时钟回拨,抛出异常if (timestamp < lastTimestamp) {throw new RuntimeException("Clock is moving backwards. Rejecting requests until " + lastTimestamp);}// 如果在同一毫秒内,增加序列号if (lastTimestamp == timestamp) {sequence = (sequence + 1) & SEQUENCE_MASK; // 使用位运算确保序列号循环// 如果序列号溢出,等待下一毫秒if (sequence == 0) {timestamp = waitForNextMillis(lastTimestamp);}} else {sequence = 0L; // 如果是新的毫秒,重置序列号}lastTimestamp = timestamp; // 更新上次生成ID的时间戳// 组合IDreturn ((timestamp - EPOCH) << (MACHINE_ID_BITS + SEQUENCE_BITS)) | (machineId << SEQUENCE_BITS) | sequence;}private long waitForNextMillis(long lastTimestamp) {long timestamp = System.currentTimeMillis();while (timestamp <= lastTimestamp) {timestamp = System.currentTimeMillis(); // 等待下一毫秒}return timestamp;}
}

【雪花算法-修正版】

/** Long: 1,000,000,000,000,000,000-9,223,372,036,854,775,807,共19位* 雪花算法变种实现: {HHmmssSSS-9位}+{系统号-2位}+{毫秒递增seq-4位}+{随机数-3位}* */
public class TiDBRandomPrimaryKeyGenerator {//机器号private String machineId;public static AtomicInteger machineIndex = new AtomicInteger(0);//序列号private long sequence = 0L;//上一个时间戳,用于保证同一毫秒内序列号不重复。private long lastTimestamp = -1L;//序列号最大值private static final long SEQUENCE_MASK = 9999;private String pattern = "HHmmssSSS";public TiDBRandomPrimaryKeyGenerator() {machineId = getInerMachineId();this.sequence = (long) (Math.random() * SEQUENCE_MASK);}public synchronized long nextId() {Date currentDate = new Date();String dateTime = DateFormatUtils.format(currentDate, pattern);String seq = getInerSequence(currentDate.getTime());String random = generateRandomString(3);StringBuilder id = new StringBuilder(32);id.append(dateTime).append(machineId).append(seq).append(random);return Long.parseLong(String.valueOf(id));}private synchronized String getInerSequence(long timestamp) {if (timestamp < lastTimestamp) {throw new RuntimeException("Clock moved backwards. Refusing to generate id for " + (lastTimestamp - timestamp) + " milliseconds");}// 如果是同一毫秒内的时间戳if (lastTimestamp == timestamp) {sequence = (sequence + 1) % SEQUENCE_MASK;} else {sequence = 0;}lastTimestamp = timestamp;return String.format("%04d", sequence);}private String getInerMachineId( ) {String machineId = String.format("%02d", machineIndex.intValue());this.machineIndex.incrementAndGet();return machineId;}public static String generateRandomString(int length) {Random random = new Random();StringBuilder sb = new StringBuilder();for (int i = 0; i < length; i++) {// 生成0到9之间的随机数,并转换为字符char randomChar = (char) (random.nextInt(10) + '0');sb.append(randomChar);}return sb.toString();}
}

相关文章:

Require:基于雪花算法完成一个局部随机,全局离散没有热点切唯一的数值Id生成器。

【雪花算法】雪花算法&#xff08;Snowflake Algorithm&#xff09;是Twitter开源的用于生成唯一ID的算法&#xff0c;它可以在分布式系统中生成唯一的64位长整数ID。这种ID生成方式既保证了趋势递增&#xff0c;又保证了在不同数据中心、不同机器上生成的ID的唯一性。 符号位&…...

libevent - Macro function

TAILQ_INIT /** Tail queue functions.* 尾队列的头结点初始化为空队列。*/ #define TAILQ_INIT(head) do { \(head)->tqh_first NULL; \(head)->tqh_last &(head)->tqh_first; \ } while (/*CONSTCOND*/0)TAILQ_INIT 宏是一个用于初始化尾队列头部…...

408算法题leetcode--第17天

101. 对称二叉树 101. 对称二叉树思路&#xff1a;递归&#xff0c;对称即两个子树的左边和右边分别一样&#xff1b;一个子树是左中右遍历&#xff0c;另一个是右中左遍历&#xff1b;写的时候可以分三步&#xff0c;确定函数参数以及返回类型&#xff0c;确定终止条件&#…...

机器人顶刊IEEE T-RO发布无人机动态环境高效表征成果:基于粒子的动态环境连续占有地图

摘要&#xff1a;本研究有效提高了动态环境中障碍物建模的精度和效率。NOKOV度量动作捕捉系统助力评估动态占用地图在速度估计方面的性能。 近日&#xff0c;上海交通大学、荷兰代尔夫特理工研究团队在机器人顶刊IEEE T-RO上发表题为Continuous Occupancy Mapping in Dynamic …...

spring-boot web + vue

依赖的软件 maven 1. 官网下载zip 文件&#xff0c;比如apache-maven-3.9.9-bin.zip 2. 解压到某个盘符&#xff0c;必须保证父亲目录的名字包含英文&#xff0c;数字&#xff0c;破折号&#xff08;-&#xff09; 3. 设置环境变量M2_HOME, 并将%M2_HOME%\bin添加到windown…...

HDFS分布式文件系统01-HDFS架构与SHELL操作

HDFS分布式文件系统 学习目标第一课时知识点1-文件系统的分类单机文件系统网络文件系统分布式文件系统 知识点2-HDFS架构知识点3-HDFS的特点知识点4-HDFS的文件读写流程知识点5-HDFS的健壮性 第二课时知识点1-HDFS的Shell介绍HDFS Shell的语法格式如下。HDFS Shell客户端命令中…...

Go语言流程控制

Go语言流程控制 1.IF-ELSE2.Switch-Caseswitch 语句Type Switch 3.select 语句4.循环语句 1.IF-ELSE Go 编程语言中 if 语句的语法如下&#xff1a; if 布尔表达式 {/* 在布尔表达式为 true 时执行 */ }例如&#xff1a; package mainimport "fmt"func main() {va…...

无人机在救灾方面的应用!

一、灾害监测与评估 实时监测与评估&#xff1a;无人机可以快速到达灾害现场&#xff0c;通过搭载的高清摄像头、红外热成像仪等设备&#xff0c;对灾区进行实时监测和灾情评估。根据捕捉到的受灾范围、火势大小、建筑物损坏情况等关键信息&#xff0c;为救援行动提供决策依据…...

面试知识点总结篇一

一、C语言和C有什么区别 C语言是面向过程&#xff0c;强调用函数将问题分解为多个子任务&#xff0c;按顺序逐步进行。数据和操作分开C则是面向对象&#xff0c;面向对象是一种基于对象和类的编程范式&#xff0c;关注如何利用对象来抽象和模拟现实世界的实体。因此引入了类&a…...

【计算机网络 - 基础问题】每日 3 题(二十五)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…...

【第十八章:Sentosa_DSML社区版-机器学习之协同过滤】

【第十八章&#xff1a;Sentosa_DSML社区版-机器学习之协同过滤】 1.算子介绍 协同过滤是推荐系统中常用的一种方法。该算法旨在填补用户-产品关联矩阵中缺少的项。在算法中&#xff0c;用户和产品都是通过一组少量的潜在因素描述&#xff0c;这些潜在因素可以用于预测用户-产…...

TDOA方法求二维坐标的MATLAB代码演示与讲解

引言 时间差定位(Time Difference of Arrival, TDOA)是一种用于确定信号源位置的技术,广泛应用于无线通信、声学定位等领域。通过测量信号到达多个接收器的时间差,可以计算出信号源的二维坐标。本文将通过MATLAB代码演示如何使用TDOA方法来求解二维坐标。 TDOA原理 TDOA…...

基于微信的原创音乐小程序的设计与实现+ssm论文源码调试讲解

第二章 开发工具及关键技术介绍 2.1 JAVA技术 Java主要采用CORBA技术和安全模型&#xff0c;可以在互联网应用的数据保护。它还提供了对EJB&#xff08;Enterrise JavaBeans&#xff09;的全面支持&#xff0c;java servlet AI&#xff0c;JS&#xff08;java server ages&…...

基于大数据技术的颈椎病预防交流与数据分析及可视化系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…...

Spring MVC中实现一个文件上传和下载功能

说到文件上传和下载&#xff0c;相信每个开发者都有或多或少的接触过文件上传的功能吧&#xff0c;文件上传和下载是我们在学习计算机网络应用常见的一个功能&#xff0c;主要涉及到用户和服务器之间的数据传输。 我们来对文件上传和下载功能的进行相关概述吧&#xff01; 文…...

Webpack 介绍

Webpack 介绍 Date: August 29, 2024 全文概要 Webpack概念&#xff1a; Webpack是一个静态的模块化的打包工具&#xff0c;可以为现代的 JavaSript 应用程序进行打包。 1-静态&#xff1a;Webpack可以将代码打包成最终的静态资源 2-模块化&#xff1a;webpack支持各种模块…...

在Linux实时监控某个应用是否运行,未运行,执行运行命令

1、shell脚本(每隔30秒检测一次) 脚本要注意的地方是&#xff1a;在Nodepad编辑的时候要使用Unix&#xff08;LF&#xff09;格式&#xff0c;避免在Linux无法执行命令 #!/bin/bash# RabbitMQ进程名称&#xff08;可能需要根据你的安装进行调整&#xff09; RABBITMQ_PROCE…...

Serilog文档翻译系列(六) - 可用的接收器、增强器、格式化输出

01、提供的接收器 Serilog 使用接收器将日志事件以各种格式写入存储。许多接收器由更广泛的 Serilog 社区开发和支持&#xff1b;可以通过在 NuGet 上搜索 serilog 标签找到。 02、增强器 日志事件可以通过多种方式增强属性。通过 NuGet 提供了一些预构建的增强器&#xff…...

傅里叶级数在机器人中的应用(动力学参数辨识)

B站首发&#xff01;草履虫都能看懂的【傅里叶变换】讲解&#xff0c;清华大学李永乐老师教你如何理解傅里叶变换&#xff0c;辨清美颜和变声原理&#xff0c;&#xff01;&#xff01;_哔哩哔哩_bilibiliB站首发&#xff01;草履虫都能看懂的【傅里叶变换】讲解&#xff0c;清…...

前端框架Vue、React、Angular、Svelte对比

在对比 React、Vue.js、Angular 和 Svelte 时&#xff0c;除了在高层次的特性上有显著差异&#xff0c;它们在核心设计理念和底层实现机制上也有明显的不同。为了清晰地理解这些框架&#xff0c;我们可以从以下几个方面来分析它们的核心不同点和底层不同点。 1. 框架类型和设计…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)

引言 工欲善其事&#xff0c;必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后&#xff0c;我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集&#xff0c;就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...