特点
- 能满足高并发分布式系统环境下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
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?