随着服务化演进,单个服务越来越多,数据库分的越来越细,有的时候一个业务需要分成好几个库,这时候自增主键或者序列之类的主键id生成方式已经不再满足需求,分布式系统中需要的是一个全局唯一的id生成规则。这时候雪花算法就出来了。

1、算法原理:

2、特性:

1,在多节点下,可以保证我们的全局id的唯一性,不会出现id重复的现象;
2,可以保证我们的id在单节点下是可以排序的;
3,id的位数固定,不会因为id的增长导致我们id的位数变更;
4,id的类型是long类型的数字,不会像uuid虽然保证了唯一性,但是为string类型,查询效率在mysql中要低于long类型;

3、算法描述:

SnowFlake算法生成id的结果是一个64bit大小的整数,它的结构如下图:

雪花算法是一个64字节的long类型数字,其中各部分含义如下。
1,第一部分1个 bit:0,这个是无意义的,它保证了我们的二进制中的首位为0,如果为1则为负数。
2,第二部分41个 bit:表示的是单位为毫秒的时间戳,来保证我们的id是有序的。
4,第三部分是10个 bit:前5个bit表示的是机房id,最多可以有32个机房;后5个bit表示的是机器id,最多可以有32台机器;
6,最后部分是12个 bit:表示的序号,就是某个机房某台机器上这一毫秒内同时生成的 id 的序号,可以保证一毫秒内有4096个id;

由于在Java中64bit的整数是long类型,所以在Java中SnowFlake算法生成的id就是long来存储的。

4、代码:

下载地址:
下载地址

5、测试:

/**
 * 雪花Id测试
 */
@Test
public void SnowFlakeTest() {
    System.out.println(GetId.createId());
}

结果:

1218902403270815744