您的位置:

雪花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,哈哈,不过要注意时钟回拨问题哦~

雪花ID生成规则

2023-05-20
雪花ID生成器

2023-05-20
MySQL雪花算法ID的详细阐述

2023-05-20
Java实现高效雪花算法生成唯一ID

2023-05-19
雪花算法id的多方面阐述

2023-05-21
js雪花代码,雪花算法js

本文目录一览: 1、求网页飘雪花源代码 2、网页飘雪花的代码是什么 3、Dreamweaver海报首页怎样做出雪花飘 4、淘宝里首页飘雪花 怎么弄啊 js代码放在哪里啊 本人小白 希望大神详解....

2023-12-08
js网页背景雪花(js实现雪花飘落特效)

本文目录一览: 1、淘宝里首页飘雪花 怎么弄啊 js代码放在哪里啊 本人小白 希望大神详解..... 2、利用JS给网页添加雪花飘落的效果 3、怎么让网页上飘着雪花 淘宝里首页飘雪花 怎么弄啊 js代

2023-12-08
雪花飘落js代码用图片,h5雪花飘落代码

2022-11-24
实现高效加密!打造全能雪花算法工具类

2023-05-19
c语言下雪效果,c语言雪花算法

2022-11-26
印象笔记记录java学习(Java成长笔记)

2022-11-12
php生成带有雪花背景的验证码,php生成带有雪花背景的验证

2022-11-18
下雪的js代码(js雪花飘落代码)

本文目录一览: 1、天猫的页面怎么注入js代码的网页下雪特效 2、求帮忙写个js脚本替换网页内容 3、QQ空间免费漂浮物代码怎么用 4、javascript:window.top.space_addI

2023-12-08
数据库的笔记mysql,数据库管理系统笔记

2022-11-24
java笔记,大学java笔记

2022-11-28
java方法整理笔记(java总结)

2022-11-08
重学java笔记,java笔记总结

2022-11-23
java笔记,尚硅谷java笔记

2022-12-01
python基础学习整理笔记,Python课堂笔记

2022-11-21
Mac笔记:在日常生活中高效实用的笔记工具

2023-05-18