2024-10-30
Go
00

目录

第一部分 概述
1.1 ID格式
1.2 自定义格式
1.3 自定义纪元
1.4 自定义设置注意事项
1.5 工作原理
第二部分 常用操作

第一部分 概述

snowflake 是一个Go语言包,提供以下功能:

  • 一个非常简单的Twitter雪花(Snowflake)ID生成器。
  • 解析已有雪花ID的方法。
  • 将雪花ID转换为其他多种数据类型以及反向转换的方法。
  • JSON的序列化/反序列化功能,便于在JSON API中使用雪花ID。
  • 单调时钟计算功能,用于防止时钟漂移。

项目地址:https://github.com/bwmarrin/snowflake

1.1 ID格式

默认情况下,ID格式遵循原始Twitter雪花(Snowflake)格式。

  • 整个ID是一个63位的整数,存储在int64类型中。
  • 41位用于存储毫秒精度的时间戳,使用自定义的纪元(epoch)。
  • 10位用于存储节点ID,范围为01023
  • 12位用于存储序列号,范围为04095

1.2 自定义格式

可以通过设置snowflake.NodeBitssnowflake.StepBits值来调整节点ID和步长(即序列号)使用的位数。需要注意的是,这两个值最多只能共享22位空间,不必全部使用22位。

1.3 自定义纪元

默认情况下,该包使用Twitter的纪元,即1288834974657(即2010年11月4日 01:42:54)。可以通过将snowflake.Epoch设置为以毫秒为单位的时间值来定义自己的纪元。

1.4 自定义设置注意事项

在调用snowflake包中的任何函数(包括NewNode())之前,需要先设置自定义的纪元或位数,否则自定义值将无法正确应用。

1.5 工作原理

每次生成一个ID时,执行流程如下:

  • 使用41位ID空间存储毫秒精度的时间戳。
  • 随后添加NodeID所占的位。
  • 再添加序列号,从0开始递增,每毫秒内生成的ID按序列号递增。如果在同一毫秒内生成的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
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:蒋固金

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!