Snowflake雪花算法

来源:互联网 发布:十八掌大数据视频 编辑:程序博客网 时间:2024/04/27 20:57
分布式系统中,一些业务场景需要获取全局唯一ID,常用方法为:twitter的snowflake、UUID/GUID、mongodb的objectId。
【UUID】
1. 使用36位的UUID,jdk的util包中UUID类生成
2. 缺点:数据长,且无序

【snowflake】
1. 数据相对短,按时间有序
2. snowflake的结构如下(每部分用-分开):
0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000
1. 第一位是标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0
2. 接下来的41位为毫秒级时间(41位的长度可以使用69年),注意,41位时间截不是存储当前时间的时间截,而是存储时间截的差值(当前时间截 - 开始时间截 得到的值),这里的的开始时间截,一般是我们的id生成器开始使用的时间,由我们程序来指定的(如下下面程序IdWorker类的startTime属性)。41位的时间截,可以使用69年,年T = (1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69
3. 然后是5位datacenterId和5位workerId(10位的长度最多支持部署1024个节点) 
4. 最后12位是毫秒内的计数。12位的计数顺序号支持每个节点每毫秒(同一机器,同一时间截)产生4096个ID序号
一共加起来刚好64位,为一个Long型。(转换成字符串后长度最多19)
snowflake生成的ID整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和workerId作区分),并且效率较高。经测试snowflake每秒能够产生26万个ID。
原创粉丝点击