首页 > 编程语言 >雪花算法SnowFlake

雪花算法SnowFlake

时间:2023-11-09 17:05:40浏览次数:42  
标签:雪花 sequence timestamp lastTimestamp long ID 算法 id SnowFlake

SnowFlake 算法结构如下:大致分为了无效位、时间位、机器位和序列号位。

1.第一位:占用1bit,其值始终是0,没有实际作用(因为二进制中最高位是符号位,1表示负数,0表示正数。生成的id一般都是用整数,所以最高位固定为0)。

2.时间戳:占用41bit,精确到毫秒,总共可以容纳约69年的时间。

3.工作机器id:占用10bit,其中高位5bit是数据中心ID,低位5bit是工作节点ID,最多可以容纳1024个节点。

4.序列号:占用12bit,每个节点每毫秒0开始不断累加,最多可以累加到4095,一共可以产生4096个ID。

SnowFlake算法在同一个毫秒内最多可以生成的ID数量:1024 * 4096 = 4194304(400多万)

SnowFlake优点:是全局唯一、自增、有序、纯数字组成查询效率高且不依赖于数据库。

适合在分布式的场景中应用,可根据需求调整具体实现细节。

缺点:趋势自增,依赖于系统时间,雪花算法在单机系统上ID是递增的,

但是在分布式系统多节点的情况下,所有节点的时钟改变或者其他情况,就有可能会出现不是全局递增的情况。

使用hutool生成

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.5.7</version>
</dependency>

使用

//通过雪花算法生成唯一ID
Long workerId = NetUtil.ipv4ToLong(NetUtil.getLocalhostStr()) >> 16 & 31;
//数据中心ID
Long dataCenterId = 1L;
//生成ID
String snowflake = IdUtil.getSnowflake(workerId, dataCenterId).nextIdStr();
long id = snowflake.nextId();

在方法nextId(),使用synchronized,保证多线程下是同步的。

方法tilNextMillis(),使得后面生成的id比上一个id大。

源码分析

public static Snowflake getSnowflake(long workerId, long datacenterId) {
   // 这个方法保证我们获取到的对象是单例的
   return Singleton.get(Snowflake.class, workerId, datacenterId);
}

public synchronized long nextId() {
   // 当前时间戳
   long timestamp = genTime();
   // 上一个时间戳,比当前时间戳还大,说明发生了时钟回拨
   if (timestamp < this.lastTimestamp) {
      if(this.lastTimestamp - timestamp < 2000){
         // 容忍2秒内的回拨,避免NTP校时造成的异常
         timestamp = lastTimestamp;
      } else{
         // 如果服务器时间有问题(时钟后退) 报错。
         throw new IllegalStateException(StrUtil.format("Clock moved backwards. Refusing to generate id for {}ms", lastTimestamp - timestamp));
      }
   }
   // 如果上次时间与当前时间相等(回拨后,也是相等的)
   if (timestamp == this.lastTimestamp) {
      final long sequence = (this.sequence + 1) & sequenceMask;
      if (sequence == 0) {
         timestamp = tilNextMillis(lastTimestamp);
      }
      this.sequence = sequence;
   } else {
      sequence = 0L;
   }

   lastTimestamp = timestamp;

   return ((timestamp - twepoch) << timestampLeftShift) | (dataCenterId << dataCenterIdShift) | (workerId << workerIdShift) | sequence;
}

private long tilNextMillis(long lastTimestamp) {
   long timestamp = genTime();
   // 循环直到操作系统时间戳变化
   while (timestamp == lastTimestamp) {
      timestamp = genTime();
   }
   if (timestamp < lastTimestamp) {
      // 如果发现新的时间戳比上次记录的时间戳数值小,说明操作系统时间发生了倒退,报错
      throw new IllegalStateException(
            StrUtil.format("Clock moved backwards. Refusing to generate id for {}ms", lastTimestamp - timestamp));
   }
   return timestamp;
}


标签:雪花,sequence,timestamp,lastTimestamp,long,ID,算法,id,SnowFlake
From: https://blog.51cto.com/u_11315052/8284670

相关文章

  • TSINGSEE青犀智能分析网关工服识别算法,如何最大限度保障工人安全?
    众所周知,TSINGSEE青犀智能分析网关算法繁多,大多数算法已经和大家讲解过了,今天就和大家聊一聊工服识别算法。工服识别算法一般应用于工地、化工、煤矿等场所,用来监督检测施工人员是否按照要求着工服,最大程度保障人员安全,具体有以下作用:1、实时监控与告警检测员工是否按照要求着......
  • TSINGSEE青犀车辆违停AI算法在园区道路管控场景中的应用方案
    一、背景与需求园区作为企业办公、生产制造的重要场所,主要道路车辆违停等违规行为会对园区的安全造成隐患,并且在上下班高峰期内,由于发现不及时,车辆违停行为会造成出入口拥堵现象,这也成为园区管理的棘手问题。二、方案设计TSINGSEE青犀针对园区的车辆违停监管难题,借助AI视频分析......
  • TSINGSEE视频智能分析人员入侵AI检测算法如何让城市管理更加高效、智慧?
    在城市管理场景中,经常面临着禁区垂钓、非法捕捞、行人闯红灯、小区盗窃、车辆乱停乱放等一系列管理难题,这给城市发展带来了不小的阻力,同时也极易增加管理的人力、物力和财力。传统的人员巡逻监管效率低并且存在时间差,很难及时发现这些违规行为,因此,利用AI智能检测技术,尤其是人员入......
  • 11.9算法
    题目二叉树的锯齿形层次遍历给你二叉树的根节点root,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。示例1:输入:root=[3,9,20,null,null,15,7]输出:[[3],[20,9],[15,7]]示例2:输入:root=[1]输出:[[1]]示例3:输入......
  • 【无人机三维路径规划】基于熊气味搜索算法BSSA实现复杂地形无人机避障三维航迹规划附
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,代码获取、论文复现及科研仿真合作可私信。......
  • 五子棋的核心算法
    五子棋是一种受大众广泛喜爱的游戏,其规则简单,变化多端,非常富有趣味性和消遣性。这里设计和实现了一个人机对下的五子棋程序,采用了博弈树的方法,应用了剪枝和最大最小树原理进行搜索发现最好的下子位置。介绍五子棋程序的数据结构、评分规则、胜负判断方法和搜索算法过程。一、相......
  • 02-异或算法
    2.异或算法2.1异或基础0^N==NN^N==0;记为无进位相加即可,1+1=0;异或运算满足交换律和结合。2.1.1不用额外变量交换两个数解法:aba=b,abb=a。2.1.2找出现奇数次的数1.题目​ 一个数组中有一种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这种数。2.......
  • Matlab决策树、模糊C-均值聚类算法分析大学教师职称学历评分可视化
    全文链接:https://tecdat.cn/?p=34203原文出处:拓端数据部落公众号本文使用Matlab编程语言中的决策树和模糊C-均值聚类算法,帮助客户对大学教师职称、学历与评分之间的关系进行深入分析。背景随着高等教育的快速发展,教师队伍的素质和能力成为了影响高校发展的重要因素。职称和学......
  • 11.8算法
    题目二叉树的中序遍历给定一个二叉树的根节点root,返回它的中序 遍历。示例1:输入:root=[1,null,2,3]输出:[1,3,2]示例2:输入:root=[]输出:[]示例3:输入:root=[1]输出:[1]提示:树中节点数目在范围[0,100]内-100<=Node.val<=100进阶: 递归算法很简单,你......
  • TSINGSEE智能分析网关V4车辆结构化数据检测算法及车辆布控
    车辆结构化视频AI检测技术,可通过AI识别对视频图像中划定区域内的出现的车辆进行检测、抓拍和识别,系统通过视频采集设备获取车辆特征信息,经过预处理之后,接入AI识别算法并与车辆底库进行对比,快速识别车辆身份和属性。TSINGSEE青犀AI智能分析网关V4在车辆的智能监管上,也具备十分灵活......