您当前的位置: 首页 >  算法

梁云亮

暂无认证

  • 5浏览

    0关注

    1211博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

雪花算法详解

梁云亮 发布时间:2022-09-26 15:36:28 ,浏览量:5

特点
  • 能满足高并发分布式系统环境下ID不重复
  • 基于时间戳,可以保证基本有序递增-
  • 不依赖第三方的库或者中间件
  • 生成效率极高
原理

雪花算法最终产生的是一个long型 64 比特位的值,第一位未使用 。 在这里插入图片描述 说明:

  • 1bit : 不用,因为二进制中最高位是符号位,1表示负数,0表示正数。生成的id一般都是用整数,所以最高位固定为0。
  • 41bit-时间戳: 用来记录时间戳,毫秒单位。
    • 41位可以表示241 ~~1 241 -12个数字
    • 如果只用来表示正整数(计算机中正数包含0),可以表示的数值范围是:0~~241 − 1,减1是因为可表示的数值范围是从0开始算的,而不是1。
    • 也就是说41位可以表示241 − 1个毫秒的值,转化成单位年则是(241 − 1) % (1000 * 60 * 60 * 24 * 365) = 69年
  • 10bit - 工作机器ID,用来记录工作机器ID:
    • 可以部署在210 = 1024 个节点,包括5位DataCenterId和Workerld。
    • 5位(bit)可以表示的最大正整数是25 − 1 =31,即可以用0、1、 2、 3… 31这32个数字,来表示不同的DataCenterId和Workerld。
    • 12bit - 序列号,用来记录同毫秒内产生的不同ID。12位(bit) 可以表示的最大正整数是212 − 1 = 40952。这4095个数字,来表示同一机器同一时间截(毫秒)内产生的4095个ID序号.

SnowFlake可以保证:

  • 所有生成的ID按时间趋势递增。
  • 整个分布式系统内不会产生重复id(因为有DataCenterId和Workerld来做区分)
代码实现
/**
 * Twitter_Snowflake
 * SnowFlake的结构如下(每部分用-分开):
 * 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000
 * 1位标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0
 * 41位时间戳(毫秒级),注意,41位时间戳不是存储当前时间的时间戳,而是存储时间戳的差值(当前时间戳 - 开始时间戳)
 * 得到的值),这里的的开始时间戳,一般是我们的id生成器开始使用的时间,由我们程序来指定的(如下面程序SnowflakeIdWorker类的startTime属性)。41位的时间戳,可以使用69年,年T = (1L             
关注
打赏
1665409997
查看更多评论
0.0930s