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

golang雪花算法实现64位的ID

  • 推荐学习文档
    • golang应用级os框架,欢迎star
    • golang应用级os框架使用案例,欢迎star
    • 案例:基于golang开发的一款超有个性的旅游计划app经历
    • golang实战大纲
    • golang优秀开发常用开源库汇总
    • 想学习更多golang知识,这里有免费的golang学习笔记专栏

以下是使用 Go 语言实现雪花算法生成 64 位 ID 的示例代码:

package mainimport ("fmt""sync""time"
)const (// 起始时间戳(2020-01-01)twepoch        = 1577836800000workerIDBits   = 5datacenterIDBits = 5sequenceBits   = 12maxWorkerID     = -1 ^ (-1 << workerIDBits)maxDatacenterID = -1 ^ (-1 << datacenterIDBits)maxSequence     = -1 ^ (-1 << sequenceBits)workerIDShift      = sequenceBitsdatacenterIDShift  = sequenceBits + workerIDBitstimestampLeftShift = sequenceBits + workerIDBits + datacenterIDBits
)type Snowflake struct {mu            sync.MutexlastTimestamp int64workerID      int64datacenterID  int64sequence      int64
}func NewSnowflake(workerID, datacenterID int64) (*Snowflake, error) {if workerID < 0 || workerID > maxWorkerID {return nil, fmt.Errorf("worker ID must be between 0 and %d", maxWorkerID)}if datacenterID < 0 || datacenterID > maxDatacenterID {return nil, fmt.Errorf("datacenter ID must be between 0 and %d", maxDatacenterID)}return &Snowflake{workerID:      workerID,datacenterID:  datacenterID,lastTimestamp: -1,sequence:      0,}, nil
}func (s *Snowflake) NextID() int64 {s.mu.Lock()defer s.mu.Unlock()timestamp := time.Now().UnixNano() / 1e6if timestamp < s.lastTimestamp {return 0}if s.lastTimestamp == timestamp {s.sequence = (s.sequence + 1) & maxSequenceif s.sequence == 0 {for timestamp <= s.lastTimestamp {timestamp = time.Now().UnixNano() / 1e6}}} else {s.sequence = 0}s.lastTimestamp = timestampreturn ((timestamp - twepoch) << timestampLeftShift) |(s.datacenterID << datacenterIDShift) |(s.workerID << workerIDShift) |s.sequence
}

你可以使用以下方式调用:

func main() {sf, err := NewSnowflake(1, 1)if err!= nil {panic(err)}id := sf.NextID()fmt.Println(id)
}

这个实现创建了一个雪花算法的结构体Snowflake,通过互斥锁保证并发安全。它根据当前时间戳、工作节点 ID、数据中心 ID 和序列号生成唯一的 64 位 ID。生成的 ID 是一个递增的数字,具有时间顺序性,并且在分布式系统中可以保证唯一性。

希望本文对你有所帮助!如果你有任何问题或建议,欢迎在评论区留言。

关注我看更多有意思的文章哦!👉👉

相关文章:

golang雪花算法实现64位的ID

推荐学习文档 golang应用级os框架&#xff0c;欢迎stargolang应用级os框架使用案例&#xff0c;欢迎star案例&#xff1a;基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识&#xff0c;这里有免费的golang学习笔…...

LeetCode 137. 只出现一次的数字 II

LeetCode 137. 只出现一次的数字 II 给你一个整数数组 nums &#xff0c;除某个元素仅出现 一次 外&#xff0c;其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。 示例 1&#xff1a;…...

新书推荐——《深度学习精粹与PyTorch实践》

深度学习绝非不可窥探的黑箱!深入理解其模型和算法的实际运作机制&#xff0c;是驾驭并优化结果的关键。你无需成为数学专家或资深数据科学家,同样能够掌握深度学习系统内部的工作原理。 本书旨在通过深入浅出的方式&#xff0c;为你揭示这些原理&#xff0c;让你在理解和解释…...

Docker:解决开发运维问题的开源容器化平台

云计算de小白 Docker是一个开源的容器化平台&#xff0c;可以将应用程序及其依赖的环境打包成轻量级、可移植的容器。 Docker为什么这么受欢迎呢?原因很简单&#xff1a;Docker可以解决不同环境一致运行的问题&#xff0c;而且占用资源少&#xff0c;速度快。 所以好的东西…...

多线程计算π

1、实现单线程计算π 2、使用任务分解方法,使用2线程,并行计算π 3、使用数据分解方法,使用2线程,并行计算π 注意:在循环中使用以上计算π的公式,n取值为1到Int.Max 问题1: import java.lang.*;public class Thread1 extends Thread{@Overridepublic void run(){l…...

JAVA开源项目 足球俱乐部管理后台 计算机毕业设计

博主说明&#xff1a;本文项目编号 T 051 &#xff0c;文末自助获取源码 \color{red}{T051&#xff0c;文末自助获取源码} T051&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…...

Arthas memory(查看 JVM 内存信息)

文章目录 二、命令列表2.1 jvm相关命令2.1.11 memory&#xff08;查看 JVM 内存信息&#xff09;举例1&#xff1a;查看 JVM 内存信息 二、命令列表 2.1 jvm相关命令 2.1.11 memory&#xff08;查看 JVM 内存信息&#xff09; 基本用法&#xff1a; memory 举例1&#xff1a;…...

C#车辆登记证识别API接口集成示例-车辆合格证识别免费的API接口

车辆登记证识别接口是一种OCR技术&#xff0c;基于深度学习算法&#xff0c;可快速、精准、自动识别车辆登记证上的文字信息。目前&#xff0c;车辆合格证识别的应用场景主要集中在与车辆相关的各类业务流程中&#xff0c;特别是汽车行业、物流运输和车辆管理等领域。 1.汽车销…...

学习笔记每日一题

给你一个整数 n &#xff0c;找出从 1 到 n 各个整数的 Fizz Buzz 表示&#xff0c;并用字符串数组 answer&#xff08;下标从 1 开始&#xff09;返回结果&#xff0c;其中&#xff1a; answer[i] "FizzBuzz" 如果 i 同时是 3 和 5 的倍数。answer[i] "Fizz…...

【巅峰算力,静谧之作】4卡4090GPU深度学习“静音”服务器

各位同仁&#xff0c;随着人工智能浪潮的汹涌澎湃&#xff0c;我们正步入一个前所未有的创新纪元。在这个充满挑战与机遇的时代&#xff0c;我愈发频繁地在工作场景中邂逅那些致力于深度学习探索的智者们。他们&#xff0c;对计算力的渴望如同对知识的追求一般&#xff0c;永无…...

论JAVA 两种“对象比较接口“的区别

前言 总所周知,java对象的比较有 三种方式 最简单的是可以调用equals(). 因为这个方法定义在Object类中&#xff0c;而我们的类都继承了Object类.所以我们自己定义的类都可以使用这个方法. 除此以外还有两个比较接口,可以通过实现他们的某些方法比较我们的对象 他们是 Com…...

在线代理提取IP:一文详解其含义和应用

在互联网时代&#xff0c;IP地址就像是每台设备的“身份证”。然而&#xff0c;有时候&#xff0c;我们需要隐藏或更改这个“身份证”&#xff0c;这时候&#xff0c;代理IP就派上了用场。那么&#xff0c;在线代理提取IP究竟是什么意思呢&#xff1f;让我们一起来探讨一下。 …...

linux-字符串函数使用

linux-字符串函数使用 输入输出长度大小拼接拷贝填充查找比较 字符串的输入&#xff0c;输出&#xff0c;长度&#xff0c;大小&#xff0c;拼接&#xff0c;拷贝&#xff0c;填充&#xff0c;查找&#xff0c;比较 输入 相关的函数有&#xff1a; gets()、getchar()、fgetc(…...

Python 06 Set

Python 实例教程 Python 实例教学_ 06_集合第二十八课[2351. 第一个出现两次的字母](https://leetcode.cn/problems/first-letter-to-appear-twice/)[217. 存在重复元素](https://leetcode.cn/problems/contains-duplicate/)[219. 存在重复元素 II](https://leetcode-cn.com/pr…...

ControllerAdvice定义统一异常处理

springboot版本&#xff1a;2.6.13<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency>在实体上添加校验注解&#xff0c;例如&#xff1a; NotBlankNotEmpty…...

Leetcode 162.寻找峰值

峰值元素是指其值严格大于左右相邻值的元素。 给你一个整数数组 nums&#xff0c;找到峰值元素并返回其索引。数组可能包含多个峰值&#xff0c;在这种情况下&#xff0c;返回 任何一个峰值 所在位置即可。 你可以假设 nums[-1] nums[n] -∞ 。 你必须实现时间复杂度为 O(…...

c语言:知识补充

c语言中编译开始会对#define&#xff0c;#include等内容做预处理&#xff0c;可以用#define写一些简单函数&#xff0c;方便使用 #include <stdio.h> #include <stdlib.h>#define MAX(A, B) ((A) > (B) ? (A) : (B))int main(){printf("%d\n", MAX(…...

Dapper介绍及特性

一、Dapper介绍及特性 Dapper是一个.NET平台上的轻量级对象关系映射&#xff08;ORM&#xff09;工具&#xff0c;它通过扩展IDbConnection接口&#xff0c;提供了一系列的扩展方法来执行SQL查询并将结果映射到.NET对象中。Dapper以其高性能和简单易用著称&#xff0c;特别适合…...

LeetCode 149. 直线上最多的点数

LeetCode 149. 直线上最多的点数 给你一个数组 points &#xff0c;其中 points[i] [xi, yi] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。 示例 1&#xff1a; 输入&#xff1a;points [[1,1],[2,2],[3,3]] 输出&#xff1a;3 示例 2&#xff1a; 输入&…...

案例研究丨国控星鲨利用DataEase释放数据潜能,重塑业务视野

国药控股星鲨制药&#xff08;厦门&#xff09;有限公司&#xff08;以下简称为国控星鲨&#xff09;始创于1952年&#xff0c;前身为厦门鱼肝油厂&#xff0c;距今已经有70余年历史&#xff0c;是国家商务部认定的“中华老字号”企业。2011年&#xff0c;国药控股与厦门轻工集…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...