diff --git a/doc/zh/snowflake.md b/doc/zh/snowflake.md index 0bd84a930..3cb9f0fae 100644 --- a/doc/zh/snowflake.md +++ b/doc/zh/snowflake.md @@ -2,7 +2,7 @@ ## 算法介绍 -`Snowflake` 算法生成 `ID` 的结果是一个 `64bit` 大小的长整,它的结构如下图: +`Snowflake` 是由 Twitter 提出的一个分布式全局唯一 ID 生成算法,算法生成 `ID` 的结果是一个 `64bit` 大小的长整,标准算法下它的结构如下图: ![snowflake](./imgs/snowflake.jpeg) @@ -10,19 +10,21 @@ - 二进制中最高位为符号位,我们生成的 `ID` 一般都是正整数,所以这个最高位固定是 0。 - `41位`,用来记录时间戳(毫秒)。 - - 41位可以表示 `2^41 - 1` 个数字。 - - 也就是说41位可以表示 `2^41 - 1` 个毫秒的值,转化成单位年则是 `(2^41 - 1) / (1000 * 60 * 60 * 24 * 365)` 约为 `69` 年。 + - `41位` 可以表示 `2^41 - 1` 个数字。 + - 也就是说 `41位` 可以表示 `2^41 - 1` 个毫秒的值,转化成单位年则是 `(2^41 - 1) / (1000 * 60 * 60 * 24 * 365)` 约为 `69` 年。 - `10位`,用来记录工作机器 `ID`。 - 可以部署在 `2^10` 共 `1024` 个节点,包括 `5` 位 `DatacenterId` 和 `5` 位 `WorkerId`。 - `12位`,序列号,用来记录同毫秒内产生的不同 `id`。 - - 12位(bit)可以表示的最大正整数是 `2^12 - 1` 共 `4095` 个数字,来表示同一机器同一时间截(毫秒)内产生的 `4095` 个 `ID` 序号。 + - `12位` 可以表示的最大正整数是 `2^12 - 1` 共 `4095` 个数字,来表示同一机器同一时间截(毫秒)内产生的 `4095` 个 `ID` 序号。 `Snowflake` 可以保证: - 所有生成的 `ID` 按时间趋势递增。 - - 整个分布式系统内不会产生重复 `ID`(因为有 `DatacenterId` 和 `WorkerId` 来做区分)。 + - 整个分布式系统内不会产生重复 `ID`(因为有 `DatacenterId (5 bits)` 和 `WorkerId (5 bits)` 来做区分)。 + +Hyperf 的 [hyperf/snowflake](https://github.com/hyperf-cloud/snowflake) 组件在设计上提供了很好的可扩展性,允许您通过简单的扩展就能实现其它基于 Snowflake 的变体算法。 ## 安装 @@ -124,4 +126,4 @@ $userId = 20190620; $id = $generator->generate($userId); -``` \ No newline at end of file +```