雪花ID生成规则

一、雪花ID简介

雪花ID是Twitter开源的分布式ID生成算法,采用信息耗尽式算法,生成的id不会重复,可以根据时间戳、机器id、序列号等信息生成64位的长整型ID。雪花ID是一个非常流行的分布式ID生成算法,其底层依赖于一个64位的long型变量,可以通过位运算等方式将long型变量表示成字符串形式的ID号,以此实现唯一ID的生成。

二、雪花ID组成部分

雪花ID组成的64位就是一个long型的数字,从二进制的角度来看,这个数字上有五部分构成:

  • 1.首位是符号位(1bit),生成的ID恒为正数,所以这个位的值始终是0。
  • 2.接下来的41位是时间戳, 表示生成的时间戳(毫秒级)。
  • 3.然后是5位数据中心标识ID和5位进程标识ID,表示在两部分信息中的机器ID标识,15位的机器编号支持的节点数达到32768个机器节点。
  • 4.紧接着是10位序列号,表示同一机器同一毫秒内生成的不同ID序号,同时支持单机每毫秒的ID数达到1024个。

通过这样的方式组装成一个64位的long型变量。

三、雪花ID生成的可靠性

雪花ID是满足以下需求的:

  • 1.全局唯一,时间戳(包括序列号)相同的id不会重复。
  • 2.趋势递增,因为采用时间戳作为生成信息,所以生成的ID越来越大。
  • 3.信息安全,序列号占了10位,理论上每个时间戳里的序列号最大可以达到1024,如果超过了这个限制,程序会自旋等待下一个毫秒再生成ID。
  • 4.高可用,如果发生时钟回拨,可以通过程序自旋等待后续时钟进行补偿。

四、雪花ID生成步骤

为了更好地理解雪花ID生成规则,我们可以将其步骤总结如下:

  1. 1.时间戳部分
  2. 
        long timestamp = System.currentTimeMillis();
        

    时间戳部分采用当前时间毫秒级别的时间戳,占用41位。

  3. 2.数据中心、机器标识部分
  4. 
        long datacenterId = 1L;
        long machineId = 2L;
        

    数据中心和机器标识这两部分都是采用配置的方式来实现,占用10位。

  5. 3.序列号部分
  6. 
        long sequence = 0L;
        long lastTimestamp = -1L;
        while (true) {
            long nowTimestamp = System.currentTimeMillis();
            if (nowTimestamp < lastTimestamp) {
                throw new RuntimeException("雪花ID系统时钟回退异常,请及时处理!");
            }
            if (nowTimestamp == lastTimestamp) {
                sequence = (sequence + 1) & maxSequence;
                if (sequence == 0) {
                    nowTimestamp = waitNextMillisecond(lastTimestamp);
                }
            } else {
                sequence = 0L;
            }
            lastTimestamp = nowTimestamp;
            return ((nowTimestamp - twepoch) << timestampShift) |
                    (datacenterId << datacenterIdShift) |
                    (machineId << machineIdShift) | sequence;
        }
        

    序列号部分采用循环累加的方式实现,可实现每毫秒1024个不同的序列号,占用10位。

五、雪花ID生成总结

雪花ID是一种很好的分布式ID生成算法,其基于时间戳、机器ID、序列号等信息生成唯一的64位ID。同时,其在可靠性、趋势递增、信息安全以及高可用等方面表现出了极佳的效果,并且也有着较为简洁易懂的生成规则。我们在实际项目中常常会使用到这种方式来生成唯一ID,哈哈,不过要注意时钟回拨问题哦~

原创文章,作者:EFPN,如若转载,请注明出处:https://www.506064.com/n/150178.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
EFPNEFPN
上一篇 2024-11-07 09:50
下一篇 2024-11-07 09:50

相关推荐

  • 解析URI编码规则

    URI(统一资源标识符)是用来标识互联网上资源的字符串文本标识符,是访问互联网资源的地址。在将URI传送到服务器或浏览器时,需要进行特定编码处理,这个编码方式就是URI编码规则。 …

    编程 2025-04-28
  • Python编写规则用法介绍

    Python作为一种广泛使用的高级编程语言,其编写规则的规范性对于提高代码可读性、美观度以及方便调试、维护至关重要。本文将从命名规则、注释规则、代码缩进等多个方面进行详细的阐述,希…

    编程 2025-04-28
  • Python缩进规则用法介绍

    本文将从多个方面对Python的缩进规则进行详细的阐述。 一、规则解答 Python中缩进是语法的一部分,它决定了程序的结构和逻辑。Python缩进规则要求同一层级的代码必须保持相…

    编程 2025-04-28
  • Python实现雪花飘落

    本文将介绍如何使用Python实现雪花飘落的效果。我们将从以下四个方面进行阐述:雪花的绘制、雪花的动画、屏幕的刷新和主函数的编写。 一、雪花的绘制 我们可以使用Python的tur…

    编程 2025-04-27
  • 数据库unique id insert全面解析

    数据库unique id insert是指在数据库中插入唯一的ID,无论是在哪个场景下,这都是非常关键的一步。在本文中,我们将从不同角度对该问题进行详细的阐述,并给出相应的代码示例…

    编程 2025-04-25
  • LL(1)语法分析器:从语法规则到语法树

    在编译原理中,语法分析是编译器的一个重要阶段。语法分析器的作用是将代码转换成语法树,以便后续阶段进行处理。LL(1)语法分析器是语法分析器的一种,它采用的是自顶向下的分析方法,可以…

    编程 2025-04-25
  • Jquery获取ID详解

    一、从jQuery中获取ID的值 在前端开发中,获取DOM的id值是一个非常常见的操作,jQuery为我们提供了非常方便的方法,通过$(“#id”)获取就可…

    编程 2025-04-25
  • 苹果ID管理中心

    一、苹果ID管理中心官网 苹果ID管理中心是用来管理您的苹果账户的网站。您可以在该网站上更改个人信息,了解最新的苹果产品以及在头像下拉框中查看所有苹果产品。苹果ID管理中心官网地址…

    编程 2025-04-23
  • this.$route.params.id的详细阐述

    this.$route.params.id是Vue.js框架的一部分,用于获取路由传递过来的参数。在某些场景下,我们需要获取传递过来的参数来进行判断或处理。下面将从多个方面对thi…

    编程 2025-04-23
  • makefile编写规则详解

    一、目标、依赖和命令 makefile中最基本的几个构成部分就是目标、依赖和命令。目标是我们要生成的文件,依赖是生成目标所需要的文件或者其他目标,命令则是生成目标的具体步骤。 ta…

    编程 2025-04-23

发表回复

登录后才能评论