1. 简介

github仓库地址:https://github.com/bwmarrin/snowflake

文档地址:https://pkg.go.dev/github.com/bwmarrin/snowflake

snowflake 是 Go 语言中雪花算法(snowflake)的实现。雪花算法是一种生成分布式全局唯一ID的算法,生成的 ID 称为 Snowflake IDs 或 snowflakes。

一个 snowflake id 有 64 bit,包含 1 bit 符号位(始终是 0)、41 bit 毫秒时间戳(最长可以记录 69 年)、10 bit 机器 id(最多 1024 台机器)、12 bit 序列号(最多每毫秒 4096 个序列号)。

雪花算法生成的 ID 能满足在高并发分布式环境系统环境下的 ID 不重复,且不依赖第三方库和中间件,生成效率很快。基于时间戳能保证基本有序递增,因此也可以按时间排序。可以根据自己的实际需求和业务场景,调整各部分的位数。

它也存在一些缺点:如强依赖于机器时钟,如果机器的时钟回拨,会导致 ID 重复的问题。生成的 ID 只能递增。

2. 使用

使用 go get 将 snowflake 包下载到 GOPATH 指定的目录下。

go get github.com/bwmarrin/snowflake

根据节点 ID 创建一个 snowflake.Node 对象。

node, _ := snowflake.NewNode(nodeID)

生成 snowflake ID,这个 ID 实际上是一个 64 位整数 int64。

id := node.Generate()

// ID
type ID int64

可以将 snowflake ID 转化为不同格式。

// 字符串
func (f ID) String() string

// 二进制位
func (f ID) Base2() string

// base64 编码
func (f ID) Base64() string

// 毫秒时间戳
func (f ID) Time() int64

// 节点 id
func (f ID) Node() int64

// 序列号
func (f ID) Step() int64