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 许可协议。转载请注明出处!