技术文摘
Golang 雪花算法实现 64 位 ID 的示例代码
Golang 雪花算法实现 64 位 ID 的示例代码
在分布式系统中,生成全局唯一的 ID 是一个常见的需求。雪花算法(Snowflake Algorithm)是一种常用的分布式 ID 生成算法,它能够在不依赖数据库等中心化存储的情况下,生成趋势递增、唯一的 64 位整数 ID。下面我们将使用 Go 语言来实现雪花算法。
让我们来了解一下雪花算法的基本原理。雪花算法生成的 64 位 ID 由以下几个部分组成:
- 1 位符号位,固定为 0,以保证生成的 ID 为正数。
- 41 位时间戳,表示自某个固定的起始时间以来的毫秒数。
- 10 位工作机器 ID,用于标识不同的节点。
- 12 位序列号,在同一毫秒内用于区分不同的 ID。
接下来,我们开始编写代码。
package main
import (
"fmt"
"sync"
"time"
)
type Snowflake struct {
machineID int64
sequence int64
lastTimestamp int64
lock sync.Mutex
}
func NewSnowflake(machineID int64) *Snowflake {
if machineID < 0 || machineID >= 1024 {
panic("机器 ID 取值范围 0 - 1023")
}
return &Snowflake{
machineID: machineID,
sequence: 0,
lastTimestamp: -1,
}
}
func (s *Snowflake) NextID() int64 {
s.lock.Lock()
defer s.lock.Unlock()
currentTimestamp := time.Now().UnixMilli()
if currentTimestamp == s.lastTimestamp {
s.sequence = (s.sequence + 1) & 4095
if s.sequence == 0 {
for currentTimestamp <= s.lastTimestamp {
currentTimestamp = time.Now().UnixMilli()
}
}
} else {
s.sequence = 0
}
s.lastTimestamp = currentTimestamp
id := ((currentTimestamp << 22) | (s.machineID << 12) | s.sequence)
return id
}
func main() {
snowflake := NewSnowflake(1)
for i := 0; i < 10; i++ {
id := snowflake.NextID()
fmt.Println(id)
}
}
在上述代码中,我们定义了一个 Snowflake 结构体,其中包含机器 ID、序列号、上一次的时间戳以及互斥锁。NewSnowflake 函数用于创建一个新的雪花算法实例,并对机器 ID 进行有效性检查。NextID 方法用于生成下一个 ID,通过处理时间戳和序列号来保证 ID 的唯一性和递增性。
在 main 函数中,我们创建了一个机器 ID 为 1 的雪花算法实例,并连续生成 10 个 ID 进行输出。
通过这种方式,我们使用 Go 语言实现了雪花算法来生成 64 位唯一 ID,为分布式系统中的数据标识提供了有效的解决方案。
希望这段代码示例对您在分布式系统中的开发工作有所帮助,让您能够更高效地处理全局唯一 ID 的生成需求。
TAGS: 示例代码 Golang 编程 Golang 雪花算法 64 位 ID
- Spring Boot 中外部接口的调用:RestTemplate 与 WebClient 对 HTTP 的操控
- 奥特曼重返 OpenAI 董事会 新成员披露 马斯克反应惊人 网友:权力博弈 Ilya 去向成谜
- 十个让双手解放的 IDEA 插件 减少冤枉代码
- 程序员写汇编游戏狂赚 3000 万美元,令人震惊!
- 企业级大模型开发的专属框架、工具与模型
- 常见的 Web 扩展开发框架
- 阿里巴巴面试题之系统设计大揭秘
- 为何不推荐使用 Date 类
- 探索.NET9 的 FCall/QCall 调用约定
- Rust 编写脚手架:关于 Clap 的那些事
- 2024 年 JavaScript 的六大新功能
- C++中 const* 与 *const 的深入剖析及区分
- 六年软件工程师生涯的五大惨痛教训
- createObjectURL API 好用至极,几个场景让您明白
- Rust 让 Python 函数速度飙升 5000%