”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 实施雪花 ID 生成器

实施雪花 ID 生成器

发布于2024-11-07
浏览:354

Implementing Snowflake Id generator

什么是雪花 ID?

雪花 ID 在分布式环境中用于生成无冲突、简短、唯一的 ID。与依赖数据库生成 ID 或使用长 128 位 UUID 等传统方法不同,Snowflake ID 使用时间和简单的按位运算。这种巧妙的技术允许每个微服务独立生成唯一的 ID,而不需要中央系统来避免冲突。

如何生成一个

生成雪花 ID 就像用三个关键部分构建拼图一样。让我们来分解一下:

  1. 取一个n位长的位串:

    首先,我们从长度为 n 的位串开始。这将保存生成唯一 ID 所需的所有信息。

  2. 分为三段:i、j、k:

    位串分为三部分,使得 i j k = n.

  • i - 时间组件:

    第一部分 i 表示当前时间。选择一个固定的开始时间(也称为纪元),i 的位将通过以纳秒为单位的当前时间减去开始时间来计算。这可确保新的 ID 始终大于旧的 ID。

  • j - 机器 ID:

    第二部分 j 是机器标识符。当你的微服务启动时,它会被分配一个唯一的ID(机器ID),它成为j部分。这可以确保不同机器生成的 ID 不会发生冲突,即使它们是在完全相同的时刻创建的。

  • k - 序列号:

    最后一部分 k 是序列号。它的作用就像一个计数器,只要在同一时间单位内生成多个 ID,该计数器就会递增。这可以保持 ID 的唯一性,即使它们是快速连续生成的。

  1. 组合各个部分: 获得 i、j 和 k 值后,将它们连接起来形成单个位字符串。然后,将此位字符串转换为基数 10,以获得最终的 Snowflake ID。

一个简单的类比

将雪花 ID 视为繁忙厨房中的特殊菜肴标签:

  • 时间(i):这就像厨房里的时钟滴答作响,确保稍后准备的菜肴比之前制作的菜肴数量更多。
  • 机器 ID (j):每个厨师(或微服务)都有自己的签名,确保他们的菜肴标签不会与其他人的冲突。
  • 序列号(k):如果厨师在一瞬间做了多道菜,他们会在标签上添加一个微小的增量,因此每道菜都有一个唯一的标签。

Go 中实现的雪花

查看此 GitHub 存储库,了解 Snowflake ID 生成的 Go 实现

来源

  1. https://blog.x.com/engineering/en_us/a/2010/announcing-snowflake
  2. https://en.wikipedia.org/wiki/Snowflake_ID
版本声明 本文转载于:https://dev.to/alquama/implementing-snowflake-id-generator-3f8k?1如有侵犯,请联系[email protected]删除
最新教程 更多>

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3