乐趣区

雪花算法04机器信息

时间部分生成后,下一步是机器信息,占 10 位。我们这里把机器信息分成两部分,一部分是数据中心 id,占 5 位,一部分是机器 id,占 5 位。这两个 id 可以在部署项目的时候根据不同的机器自定义不同的 id,这样能人为的保障每个 id 都不同。比如:


/** 设置数据中心 id 为 1 */

private static final long DATA_ID = 1L;

/** 设置机器 id 为 2 */

private static final long WORK_ID = 2L;

也可以根据自己机器的情况自动生成,不过有很小很小的风险会重复,这个风险碰到的几率不大,当然如果能手动设置还是最好的。我们来说一下自己生成的情况。

我们的 jdk 库中,有 api 可以获取本地机器的 hostname 和 hostaddress,我们来看一下:

我们来把 hostname 的信息作为数据中心 id,把 hostaddress 的信息作为机器 id,如何把两个字符串改为两个数字 id 呢?其实很简单。获取字符串的字节数组,然后把数组的每个数字相加,对节点数的最大值取余:

每个 id 的长度都是 5,二进制中 5 个 1 的最大值就是 31,所以数据 id 和机器 id 每个的最大值也是 31,下面是获取两个 id 的方法:

如果出现异常,返回一个随机数,保证 id 的可靠性。下面可以定义两个的 id 了:

因为机器信息分成了两部分分别生成的,所以,要分别位移,数据 id 要向左位移 17 位,机器 id 要向左位移 12 位。正好占据 10 位。

现在我们再来看下第二部分机器信息的限制,这两个 id 每个的值都占五位,二进制的值从 00000 到 11111,整数的范围就是 0 -31 之间共 32 个。那么雪花算法可以部署的机器数就是 32*32=1024 个,这是机器信息的限制,现在看这数字也是足足的够了。注意如果自己给这两个参数赋值,也要限制在 31 之内。

代码地址:https://gitee.com/blueses/sno… 04

退出移动版