当前位置: 首页 > 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 是一个递增的数字,具有时间顺序性,并且在分布式系统中可以保证唯一性。

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

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

http://www.lryc.cn/news/447420.html

相关文章:

  • LeetCode 137. 只出现一次的数字 II
  • 新书推荐——《深度学习精粹与PyTorch实践》
  • Docker:解决开发运维问题的开源容器化平台
  • 多线程计算π
  • JAVA开源项目 足球俱乐部管理后台 计算机毕业设计
  • Arthas memory(查看 JVM 内存信息)
  • C#车辆登记证识别API接口集成示例-车辆合格证识别免费的API接口
  • 学习笔记每日一题
  • 【巅峰算力,静谧之作】4卡4090GPU深度学习“静音”服务器
  • 论JAVA 两种“对象比较接口“的区别
  • 在线代理提取IP:一文详解其含义和应用
  • linux-字符串函数使用
  • Python 06 Set
  • ControllerAdvice定义统一异常处理
  • Leetcode 162.寻找峰值
  • c语言:知识补充
  • Dapper介绍及特性
  • LeetCode 149. 直线上最多的点数
  • 案例研究丨国控星鲨利用DataEase释放数据潜能,重塑业务视野
  • 网络基础概念和 socket 编程
  • TypeScript 中的接口、泛型与自定义类型
  • 常州威雅学校:跟随这场音乐盛宴,溯回她的音乐之路
  • 【YashanDB知识库】由于hist_head$中analyze time小于tab$中analyze time导致的sql语句执行慢
  • 【有啥问啥】深度理解主动学习:机器学习的高效策略
  • 智能守护者X100 - 自动化生产线智能机器人安全监控管理系统
  • harmonyos面试题
  • 神经网络介绍及其在Python中的应用(一)
  • 数据流处理技术与Flink框架
  • qt中QTatlewidget类常用操作表格的函数有哪些?
  • Linux上的C/C++编程