用雪花算法生成全局唯一序列

雪花算法是一种分布式唯一ID生成算法,通过对时间戳、工作节点ID和序列号进行位运算和组合,生成一个可排序且唯一的64位ID。

实现原理:

  1. 首先,我们需要定义算法中的参数:

    • 时间戳:使用当前时间戳,精确到毫秒级别。
    • 工作节点ID:用于区分不同的工作节点,保证在分布式环境下生成的ID是唯一的。
    • 序列号:每个工作节点上每毫秒生成的序列号,用于解决并发生成ID时的顺序性问题。
  2. 在算法中,我们使用一个64位的long型变量来表示生成的唯一ID。其结构如下所示:

    • 第1位:固定为0,保证生成的ID为正数。
    • 第2至42位:表示时间戳,共41位,可表示2^41-1个毫秒值,大约69年的时间。
    • 第43至47位:表示工作节点ID,共5位,可表示最多32个不同的工作节点。
    • 第48至63位:表示序列号,共16位,可表示最多2^16-1个不同的序列号。
  3. 在生成唯一ID的过程中,需要注意以下几点:

    • 获取当前时间戳,并与上一次生成ID的时间戳进行比较,防止时间回拨导致生成重复ID。
    • 对并发生成ID的情况,需要通过序列号来保证生成的ID的顺序性并避免冲突。
    • 如果当前时间戳与上一次生成ID的时间戳相同,则需要增加序列号并重新计算时间戳,直到下一毫秒开始。
  4. 最后,将时间戳、工作节点ID和序列号进行位运算和组合,生成最终的唯一ID。生成ID的过程可以保证在相同毫秒内、相同工作节点和序列号的情况下生成的ID是唯一的。

通过以上原理,雪花算法可以在分布式环境中生成大量唯一ID,并且保证ID的有序性和唯一性。在实际应用中,可以根据具体需求调整参数的位数,以满足不同场景下对ID的要求。

使用Java实现雪花算法生成16位数字的代码:

public class SnowflakeAlgorithm {private long sequence = 0L;private long lastTimestamp = -1L;private final long workerIdBits = 5L;private final long maxWorkerId = -1L ^ (-1L << workerIdBits);private final long sequenceBits = 10L;private final long sequenceMask = -1L ^ (-1L << sequenceBits);private final long workerIdShift = sequenceBits;private final long timestampLeftShift = sequenceBits + workerIdBits;private final long twepoch = 1622505600000L;private final long workerId;public SnowflakeAlgorithm(long workerId) {if (workerId < 0 || workerId > maxWorkerId) {throw new IllegalArgumentException("Worker ID must be between 0 and " + maxWorkerId);}this.workerId = workerId;}public synchronized long nextId() {long timestamp = timeGen();if (timestamp < lastTimestamp) {throw new RuntimeException("Clock moved backwards. Refusing to generate id for " + (lastTimestamp - timestamp) + " milliseconds.");}if (timestamp == lastTimestamp) {sequence = (sequence + 1) & sequenceMask;if (sequence == 0) {timestamp = tilNextMillis(lastTimestamp);}} else {sequence = 0L;}lastTimestamp = timestamp;return ((timestamp - twepoch) << timestampLeftShift) |(workerId << workerIdShift) |sequence;}private long tilNextMillis(long lastTimestamp) {long timestamp = timeGen();while (timestamp <= lastTimestamp) {timestamp = timeGen();}return timestamp;}private long timeGen() {return System.currentTimeMillis();}
}public class Main {public static void main(String[] args) {SnowflakeAlgorithm snowflake = new SnowflakeAlgorithm(1);for (int i = 0; i < 10; i++) {long id = snowflake.nextId();System.out.println(id);}}
}

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

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

相关文章

记录一个常量定义导致的重复问题duplicate symbol ‘_kk‘ in:

原因&#xff1a; 在.h文件中定义了一个常量 如下 NSString *const kk "FASDF";interface CardCourseViewController : LBBaseViewControllerend将这句代码去掉即可 NSString *const kk "FASDF";![请添加图片描述](https://img-blog.csdnimg.cn/direct…

工业RFID技术发展趋势分析

RFID技术是物联网的重要组成部分&#xff0c;是连接物理世界和数字世界的关键节点。RFID技术已经广泛应用于供应链管理、智能物流、零售、医疗、安防等领域&#xff0c;在工业制造领域也有着广泛的应用前景和市场潜力。 工业RFID技术发展趋势分析 工业RFID技术是一种利用无线射…

买工业用品就找震坤行,提供震坤行商品数据,数据分析的API接口

要接入API接口以采集电商平台上的商品数据&#xff0c;可以按照以下步骤进行&#xff1a; 1、找到可用的API接口&#xff1a;首先&#xff0c;需要找到支持查询商品信息的API接口。这些信息通常可以在电商平台的官方文档或开发者门户网站上找到。 2、注册并获取API密钥&#x…

什么是差值表达式

在Vue.js中&#xff0c;差值表达式是一种基本的数据绑定形式&#xff0c;用于将数据绑定到文档对象模型&#xff08;DOM&#xff09;上。差值表达式通常使用双大括号 {{ }} 来表示&#xff0c;这种语法非常直观。当Vue实例的数据发生变化时&#xff0c;差值表达式的内容也会相应…

CCNP课程实验-06-EIGRP-Trouble-Shooting

目录 实验条件网络拓朴 环境配置开始排错错误1&#xff1a;没有配置IP地址&#xff0c;IP地址宣告有误错误2&#xff1a;R3配置了与R1不同的K值报错了。错误3&#xff1a;R4上的AS号配置错&#xff0c;不是1234错误4&#xff1a;R2上配置的Key-chain的R4上配置的Key-chain不一致…

LCR 155. 将二叉搜索树转化为排序的双向链表

解题思路&#xff1a; 中序遍历法&#xff08;二叉搜索树在中序遍历时是从小到大排列的&#xff09;。 // 打印中序遍历 void dfs(Node root) {if(root null) return;dfs(root.left); // 左System.out.println(root.val); // 根dfs(root.right); // 右 }采用head作为返回&am…

C++:自创小游戏

欢迎来玩&#xff0c;每次都有不一样的结果。 长达142行。 #include<bits/stdc.h> #include<windows.h> #define random(a,b) (rand()%(b-a1)a) using namespace std; int main(){int n;cout<<"输1~10,越小越好,不告诉你有什么用&#xff0c;当然也可…

跑步中位数

title: 跑步中位数 date: 2024-01-04 15:47:51 tags: 对顶堆 catefories: 算法进阶指南 题目大意 解题思路 动态维护中位数问题。可以建立两个二叉堆&#xff0c;一个大顶堆一个小顶堆&#xff0c;在依次读入整数序列的过程中&#xff0c;设当前序列长度为 M M M,我们始终保持…

docker-简单说说cgroup

前面我们简单说了下namespace&#xff0c; 现在我们来接着简单说说cgroup。通过docker-简单说说namespace文章我们知道&#xff1a; namespace 是为了隔离进程组之间的资源&#xff0c;那cgroup就是为了对进程组的监控和限制资源。Cgroup 可以限制进程组使用的资源数量和分配&a…

中国5米分辨率坡度数据

中国5米分辨率坡度数据 坡度是地表单元陡缓的程度&#xff0c;通常把坡面的垂直高度和水平距离的比值称为坡度。坡度的表示方法有百分比法、度数法、密位法和分数法四种&#xff0c;其中以百分比法和度数法较为常用。 中国5米分辨率坡度数据集&#xff0c;利用5米分辨率DEM数据…

借还款记账表,借款还款记账软件

我们每个人都在为生活奔波&#xff0c;为事业打拼。但有时候&#xff0c;生活中的一些小事情&#xff0c;比如朋友间的借贷、还款&#xff0c;就可能让我们的生活变得有些混乱。为了解决这个问题&#xff0c;一个全新的借还款记账软件【晨曦记账本】横空出世&#xff0c;它不仅…

如何实现APP安全加固?加固技术、方法和方案

​ 本文我们着重分享App安全加固的相关内容。 ​ &#xff08;安全检测内容&#xff09; 通过前面的文章我们知道了app安全检测要去检测哪些内容&#xff0c;发现问题后我们如何去修复&#xff1f;如何避免安全问题&#xff1f;首先我们先来讲一下APP安全加固技术。 Ipa Guar…

在Impala中分页 进行SQL查询并分页可以使用LIMIT子句来限制返回结果集的数量。

在Impala中进行SQL查询并分页可以使用LIMIT子句来限制返回结果集的数量。 示例1&#xff1a;获取前5条记录 SELECT * FROM table_name LIMIT 5;示例2&#xff1a;从第6条开始获取后面的5条记录&#xff08;每次获取5条&#xff09; SELECT * FROM (SELECT t.*, ROW_NUMBER()…

pinia 给 state 指定变量类型

pinia 给 state 指定变量类型 问题描述 自从用 vitetsvue3 以来&#xff0c;我一直有一个很大的疑问&#xff0c;就是 pinia 中的 state 变量类型该从哪定义&#xff0c;如何定义它&#xff1f; 因为我在使用未定义类型的 state 变量的时候一直会有一个提示&#xff0c;提示说…

nodejs和vuejs的区别

一、vue项目开发中&#xff0c;两个经常混合使用。 不同&#xff1a; 1、概念不同&#xff1a; 一个是前端框架&#xff0c;一个是服务端语言。 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。 Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型&#xff0c;使…

免费搭建知识付费平台:让知识更有价值

明理信息科技知识付费saas租户平台 在当今的知识经济时代&#xff0c;一个高效、便捷的知识服务平台对于企业和个人至关重要。然而&#xff0c;市面上的众多知识服务平台中&#xff0c;许多产品存在高昂的费用、无用功能的堆砌、无法定制化等问题&#xff0c;让用户进退两难&…

mysql根据查询结果连续序号

业务数据一般都不是连续的ID,导出Excel的时候要求连续序号 set rownum0; SELECT rownum:rownum1 as 序号,a.* from user a

C# 中英文及字符所占字节详解

1.C#中英文字符占用的空间大小 一般在英文状态下一个字母或字符占用一个字节&#xff0c;一个汉字用两个字节表示。 ASCII 码中&#xff0c;一个英文字母(不分大小写)为一个字节&#xff0c;一个中文汉字为两个字节。 UTF-8 编码中&#xff0c;一个英文字为一个字节&#xff…

VS Code打造Autohotkey环境

文章目录 简介和安装功能说明测试相关推荐 简介和安装 Autohotkey堪称自动化效率神器&#xff0c;可以穿透Windows窗口&#xff0c;获取UI对象&#xff0c;从而可以在现有程序的基础上&#xff0c;进行有针对性的开发&#xff0c;大大提高效率。 VS Code提供了AHK插件&#x…

KNN 分类(选择最佳的 K 值,并可视化模型精度与 n_neighbors 的关系)

import matplotlib.pyplot as plt from sklearn.datasets import load_breast_cancer from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier# 导入乳腺癌数据集 cancer load_breast_cancer()# 划分训练集和测试集 X_tra…