首页 > 编程语言 >Snowflake算法js(实现)

Snowflake算法js(实现)

时间:2024-10-18 16:50:35浏览次数:5  
标签:sequence timestamp 0000000000 生成 算法 ID js Snowflake

Snowflake算法是一种分布式环境下的唯一ID生成算法,最初由Twitter开发并在其内部使用。该算法旨在生成全局唯一、递增的64位整数ID,同时具备高性能的特点。以下是Snowflake算法的一些关键特点及其工作原理:

特点

  1. 全局唯一性:生成的ID在分布式环境中几乎可以保证全局唯一。
  2. 时间有序:生成的ID随着生成时间递增,方便排序。
  3. 无须依赖外部系统:不需要依赖数据库或其他中心化的服务来生成ID,降低了系统的耦合度。
  4. 高吞吐量:即使在高并发情况下也能保持高性能。

工作原理

Snowflake生成的ID是一个64位的整数,分为以下几个部分:

  • 时间戳部分(41位):表示生成ID的时间戳(毫秒级),占41位,最高位是符号位(始终为0,表示正数),剩余40位用来表示时间戳。
  • 机器标识部分(10位):标识生成ID的工作机器,可以区分不同的服务器。
  • 序列号部分(12位):表示同一毫秒内生成的不同ID,可以区分同一台机器在同一毫秒内生成的多个ID。

ID格式

一个典型的Snowflake ID结构如下所示:

0 - 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000 0000000000
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
------------------- --------------- --------------- ---------------
        sign bit          timestamp            workerId              sequence

实现步骤

  1. 初始化时间戳基准:选择一个固定的时间点作为基准时间,比如某个项目的启动时间。所有生成的ID的时间戳部分都是相对于这个基准时间的偏移量。
  2. 分配机器标识:每台服务器在启动时需要分配一个唯一的机器标识(workerId),通常可以通过配置文件或环境变量设置。
  3. 生成ID:当需要生成新的ID时,算法会根据当前的时间戳、机器标识和序列号来组合成一个64位的整数。

示例代码

以下是一个简单的JavaScript实现示例:

class Snowflake {
  constructor(workerId, epoch = 1514764800000 /* 2018-01-01 */) {
    this.workerId = workerId;
    this.epoch = epoch;
    this.sequence = 0;
    this.lastTimestamp = -1;
  }

  nextId() {
    const timestamp = Date.now();

    if (timestamp < this.lastTimestamp) {
      throw new Error(`Clock moved backwards. Refusing to generate id for ${this.lastTimestamp - timestamp} milliseconds`);
    }

    if (timestamp === this.lastTimestamp) {
      this.sequence = (this.sequence + 1) & 0xFFF; // 12 bits
      if (this.sequence === 0) {
        timestamp = this.waitNextMillis(this.lastTimestamp);
      }
    } else {
      this.sequence = 0;
    }

    this.lastTimestamp = timestamp;

    return ((timestamp - this.epoch) << 22) |
           (this.workerId << 12) |
           this.sequence;
  }

  waitNextMillis(lastTimestamp) {
    let timestamp = Date.now();
    while (timestamp <= lastTimestamp) {
      timestamp = Date.now();
    }
    return timestamp;
  }
}

// 使用示例
const snowflake = new Snowflake(1); // 假设这是机器标识
console.log(snowflake.nextId());

注意事项

  • 时间回拨:在时间回拨的情况下,即系统时钟向后调整,会导致生成的ID时间戳部分变小,从而产生重复ID。可以通过暂停生成直到时间恢复来解决。
  • 序列号溢出:在同一个毫秒内生成超过最大序列号(默认12位即4096个)的情况下,需要等待下一个毫秒再继续生成。

通过Snowflake算法,你可以高效地生成全局唯一的ID,并且非常适合分布式系统的场景。在实际部署时,请确保正确配置和同步时间,以避免潜在的问题。

标签:sequence,timestamp,0000000000,生成,算法,ID,js,Snowflake
From: https://www.cnblogs.com/Jacky2258/p/18474594

相关文章

  • 安全帽AI检测算法在工业安全领域的全面解析及开源代码及相关项目
    在各类施工现场,安全帽的佩戴是保障工人生命安全的重要措施。为了确保工人正确佩戴安全帽,安全帽检测算法发挥着关键作用。而在实际应用中,结合AI智能分析网关V4与EasyCVR视频汇聚智能分析平台,更是能将安全帽检测的效果发挥到极致。例如,在某大型建筑工地,通过在施工现场安装多个......
  • 数据驱动的未来:AI智能分析网关V4车辆违停算法与智慧城市交通管理
    在现代交通管理中,车辆违停问题一直是影响城市交通秩序和安全的重要因素。AI智能分析网关V4车辆违停算法则可以更高效地管理车辆违停现象。AI车辆违停算法通常基于计算机视觉技术。首先,通过摄像头采集道路上的图像或视频信息。这些摄像头可以安装在路口、路段等关键位置,以实现......
  • 基于灰狼优化算法(GWO)解决柔性作业车间调度问题(Matlab代码实现)
     ......
  • Unity 华为快游戏JS桥接 实现写日志等功能
    之前接入微信小游戏本身代码js桥接比较完善,抖音小游戏有缺少但也没缺的这么多,华为这边的API,大残啊!官方转换插件Github仓库上一次提交在3月份。(截至现在)API给的很简略,接入js代码那里说看demo,但unity的demo里面没jslib,另一个比较完善的demo看起来像是cocos的,比较无奈。还好用unity......
  • ROS2安装turtlebot4机器人,运行ign gazebo仿真加载机器人模型(用于评测catorgrapher算法
    前言本人最近做了一个任务,需要评测catorgrapher算法的精度,这个过程中需要使用到ros2仿真过程中机器人的真实轨迹和估计轨迹,在/odom和/sim_ground_true_pose话题中提取到机器人的真实轨迹,同时改变catorgraper的源码,在启动catorgraper算法后产生tum格式轨迹文件,最后使用evo进行......
  • 基于灰狼算法优化BP神经网络实现数据分类
    近年来随着数据科学的迅速发展和人工智能技术的不断革新,数据分类成为了一个重要的研究领域,在这个领域内,神经网络是一个非常重要的方法,然而神经网络的性能往往取决于其网络结构和参数设定,这使得如何优化神经网络成为一个关键的问题,其中灰狼算法与BP神经网络相结合是一个优秀的选......
  • 基于粒子群算法的PID控制器优化设计
    PID控制器作为一种重要的控制方式,在很多工程领域都得到了广泛的应用,而如何优化PID控制器的参数,使其满足特定的工程需求,是一个值得研究和探讨的问题,粒子群算法(ParticleSwarm Optimization,PSO)作为一种优化算法,已经被广泛应用于PID控制器的参数优化中,并且取得了良好的效果,本文介......
  • js 中断循环的几种方式
    在JavaScript中,`forEach`方法是用来遍历数组的元素,并且它不能被中断或退出。如果你需要在满足某个条件时中断循环,你可以考虑使用其他循环结构,比如`for`循环、`for...of`循环或者`while`循环。下面是一些替代方案:1.**使用`for`循环**:```javascriptletarray=......
  • js 通过链接下载文件
    通过url单文件下载,并且解决a.download修改文件名不生效问题 /***通过url单文件下载,并且解决a.download修改文件名不生效问题*@param{String}url文件url*@param{String}filename文件自定义名称*@returnsPromise*/exportfunctiondownloadFileByUr......
  • Nuxt.js 应用中的 app:templates 事件钩子详解
    title:Nuxt.js应用中的app:templates事件钩子详解date:2024/10/18updated:2024/10/18author:cmdragonexcerpt:app:templates是Nuxt.js中一个强大的生命周期钩子,它在NuxtApp生成过程中调用。这一钩子允许开发者自定义、修改或添加新文件到构建目录,提供了极大的......