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

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

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

相关文章:

  • 无人机侦测:频谱无线电侦测设备技术详解
  • OSPFv3协议几类LSA介绍
  • redis序列化数据时,如何包含clsss类型信息?
  • 多线程计算π
  • 力扣9.25
  • 51单片机如何判断浮点数nan
  • QT 如何判断电脑已安装某个软件
  • 知识点复习4
  • 漫步者头戴式耳机好用吗?漫步者、西圣、万魔顶级机型测评对比
  • (23)mysql中mysqldump备份数据库
  • java SE -- 线程 asset
  • 基于yolov8的游戏人物自动锁定功能
  • 排序--堆排序【图文详解】
  • Vert.x 和 Spring Boot 是两种流行的 Java 框架的比较
  • Java AI 编程助手
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • angular2开源库收集
  • JS笔记四:作用域、变量(函数)提升
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • React-Native - 收藏集 - 掘金
  • Vue ES6 Jade Scss Webpack Gulp
  • 高度不固定时垂直居中
  • 高性能JavaScript阅读简记(三)
  • 老板让我十分钟上手nx-admin
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 数据科学 第 3 章 11 字符串处理
  • 网页视频流m3u8/ts视频下载
  • Android开发者必备:推荐一款助力开发的开源APP
  • hi-nginx-1.3.4编译安装
  • Java性能优化之JVM GC(垃圾回收机制)
  • MyCAT水平分库
  • 回归生活:清理微信公众号
  • ​数据链路层——流量控制可靠传输机制 ​
  • # include “ “ 和 # include < >两者的区别
  • #### golang中【堆】的使用及底层 ####
  • #laravel 通过手动安装依赖PHPExcel#
  • #pragma once与条件编译
  • #stm32整理(一)flash读写
  • (02)Unity使用在线AI大模型(调用Python)
  • (1)svelte 教程:hello world
  • (2)MFC+openGL单文档框架glFrame
  • (HAL库版)freeRTOS移植STMF103
  • (void) (_x == _y)的作用
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (强烈推荐)移动端音视频从零到上手(上)
  • (十三)Flask之特殊装饰器详解
  • (四)鸿鹄云架构一服务注册中心
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .NET 设计一套高性能的弱事件机制