snowflake
是一个Go
语言包,提供以下功能:
Twitter
雪花(Snowflake
)ID生成器。项目地址:https://github.com/bwmarrin/snowflake
默认情况下,ID
格式遵循原始Twitter
雪花(Snowflake
)格式。
ID
是一个63
位的整数,存储在int64
类型中。41
位用于存储毫秒精度的时间戳,使用自定义的纪元(epoch
)。10
位用于存储节点ID
,范围为0
到1023
。12
位用于存储序列号,范围为0
到4095
。可以通过设置snowflake.NodeBits
和snowflake.StepBits
值来调整节点ID
和步长(即序列号)使用的位数。需要注意的是,这两个值最多只能共享22
位空间,不必全部使用22
位。
默认情况下,该包使用Twitter
的纪元,即1288834974657
(即2010年11月4日 01:42:54
)。可以通过将snowflake.Epoch
设置为以毫秒为单位的时间值来定义自己的纪元。
在调用snowflake
包中的任何函数(包括NewNode()
)之前,需要先设置自定义的纪元或位数,否则自定义值将无法正确应用。
每次生成一个ID时,执行流程如下:
默认的Twitter
格式如下所示:
+--------------------------------------------------------------------------+ | 1 Bit Unused | 41 Bit Timestamp | 10 Bit NodeID | 12 Bit Sequence ID | +--------------------------------------------------------------------------+
在默认设置下,每个节点ID每毫秒最多可以生成4096
个唯一ID
。
代码片段:
go// 创建一个新的节点并设置节点编号为1
node, _ := snowflake.NewNode(1)
// 生成一个ID
id := node.Generate()
// Print out the ID in a few different ways.
println("Int64 ID: ", id)
println("String ID: ", id)
println("Base2 ID: ", id.Base2())
println("Base64 ID: ", id.Base64())
println("ID Time : ", id.Time())
println("ID Node : ", id.Node())
println("ID Step : ", id.Step())
println("ID : ", node.Generate().Int64())
运行结果:
Int64 ID: 1851456523897671680 String ID: 1851456523897671680 Base2 ID: 1100110110001101100011110011000101000000000000001000000000000 Base64 ID: MTg1MTQ1NjUyMzg5NzY3MTY4MA== ID Time : 1730256608353 ID Node : 1 ID Step : 0 ID : 1851456523897671681
本文作者:蒋固金
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!