首页 > 编程知识 正文

雪花算法突破69年限制(雪花算法是18还是19位)

时间:2023-05-04 13:48:18 阅读:73794 作者:76

JVA实现雪地算法

什么是雪花算法SnowFlake?

SnowFlake算法是Twitter设计用于在分布式系统中生成唯一ID的算法,Twitter每秒钟可以满足上万个消息ID分配请求。 这些消息ID是唯一的,并具有大致的增长顺序。

雪花算法SnowFlake和UUID有什么区别?

分析UUID

什么是uid?

uid是通用唯一标识符的缩写,在开放软件基础(OSF )标准中,是网卡的MAC地址、时间戳、名称空间、随机或伪随机数、泰国使用这些元素生成UUID。

uid由128位二进制文件组成,通常转换为十六进制数字,用字符串表示。

java有一个UUID类,有四个不同的UUID生成策略。

四种不同的UUID生成策略?

randomly:基于随机数生成UUID,因为Java的随机数是伪随机数,所以可以计算重复的概率。

基于时间的:是基于时间的UUID。 这通常根据当前时间、随机数和本地Mac地址计算。 随附的JDK包中没有此算法,我们在一些UUIDUtil (如log4j.core.util )中重新定义UUID的顶部和底部。

DCE安全: DCE安全的UUID。

name-based :通过根据名称的UUID计算名称和名称空间的MD5来计算UUID。

uid的优缺点是什么?

好处

本地生成,不通过网络I/O,性能快。

无序,无法预测他的生成顺序。 (当然这也是他的缺点之一)

缺点

128位二进制文件通常转换为36位十六进制文件,太长只能用字符串存储,占用大量空间。

不能生成增量有序的数字。

使用uid的场景?

应用uid的场景不需要担心过多的空间占用,也不需要生成有增长趋势的数字。 在Log4j中,他将UUID添加到UuidPatternConverter中以标识每个日志。

雪花算法SnowFlake比UUID好吗?

雪花算法可以生成升序数字,但不能用UUID生成。

雪花算法的实现原理?

SnowFlake算法生成的ID是一个64位整数,其结构如下: 用“-”符号分隔。

0-000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

1比特标记部分:在java中,long的最高位比特为符号比特,正数为0,负数为1,一般生成的ID为正数,因此为0;

41位时间戳部分:这是毫秒级别的时间,在典型实现中不存储当前时间戳,而是使用时间戳的差(当前时间-固定的开始时间),允许生成的ID从较小的值开始; 41位时间戳可用于69年,(1L 41 )/(1000L 60 60 24 365 )=69年。

10位节点部分:在Twitter实现中,通过使用前5位作为数据中心标识符,使用后5位作为计算机标识符,可以部署1024个节点。

12位序列号部分:支持同一节点在同一毫秒内生成4096个ID。

SnowFlake算法生成的ID几乎随时间增加。 在分布式系统中使用时,必须注意数据中心ID和计算机ID必须是唯一的,以确保每个节点生成的ID是唯一的。 如上所述,我们可能不一定要使用5位作为数据中心的标识,5位作为机器的标识。 根据我们的业务需要,可以灵活地分配节点部分。 例如,如果不需要数据中心,所有10位都可以用作机器的标识。 如果数据中心较少,则也可以只使用3位作为数据中心,7位作为计算机标识符。

雪花算法实现snowflake

使用雪地算法时的注意事项

SnowFlake算法生成的ID几乎随时间增加。 在分布式系统中使用时,必须注意数据中心ID和计算机ID必须是唯一的,以确保每个节点生成的ID是唯一的。

左移,右移运算符

左移运算符

将一个运算对象的各二进制位全部向左移动几个位(舍弃左边的二进制位,向右添加0 )。

注意: java的整数位是32位。

小技巧:

对于正数来说,左移位相当于乘以2 (其中,效率高于乘法)。

例如,将1向左移动12位,相当于12的12次方。 结果是4096。

system.out.println(112; //4096

系统. out.println (math.pow (2,12 ); //4096

右移位运算符

将一个运算对象的各二进制位全部向右移位几个,正数向左补充0,负数向左补充1。

小技巧:

对于正数来说,右1位移相当于除以2 (但是,比除法运算效率更高)。

例如,如果将4向右偏移2位,则相当于4除以2的平方。 结果是1。

system.out.println(42; //1

system.out.println(4/math.pow ) ) 2,2 ); //1

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。