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

Snowflake算法js(实现)

时间:2024-10-15 11:22:20浏览次数:10  
标签: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://blog.csdn.net/qq_35374791/article/details/142941344

相关文章

  • jsp电网运行信息检索系统813hp--程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表员工,变电站,运行信息,维修信息开题报告内容一、项目背景与意义随着电力行业的快速发展,电网规模不断扩大,电网运行信息的管理与检索变得日益重要。传统的电网信......
  • jsp电脑配件销售网站的设计与实现qrl6o(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表用户,商品分类,商品品牌,商品信息开题报告内容一、课题名称电脑配件销售网站的设计与实现二、研究背景与意义随着互联网技术的快速发展,电子商务已成为现代商......
  • jsp电动车停放与充电系统113k1(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表用户,充电桩,充电信息,完成订单开题报告内容一、选题背景与意义随着电动车的普及,其停放与充电问题日益凸显。传统的停放与充电方式存在诸多不便,如停车场地有限......
  • LeetCode刷题日记之回溯算法(四)
    目录前言非递减子序列全排列全排列II总结前言今天是学习回溯算法的第四天,我们继续来一起学习回溯算法蕴含的逻辑处理,希望博主记录的内容能够对大家有所帮助,一起加油吧朋友们!......
  • 【Next.js 项目实战系列】02-创建 Issue
    原文链接CSDN的排版/样式可能有问题,去我的博客查看原文系列吧,觉得有用的话,给我的库点个star,关注一下吧 上一篇【Next.js项目实战系列】01-创建项目创建Issue配置MySQL与Prisma​在数据库中可以找到相关内容,这里不再赘述添加model​本节代码链接#schema.pri......
  • 基于jsp+mysql+Spring的SpringBoot招聘网站项目
    基于jsp+mysql+Spring的SpringBoot招聘网站项目(完整源码+sql)主要实现了管理员登录,简历管理,问答管理,职位管理,用户管理,职位申请进度更新,查看简历......
  • 素数筛法算法
    素数定义:素数是指在大于1的自然数中,除了1和它本身外,没有其他因数的数。换句话说,素数只有两个正因数:1和它本身。注意:0和1既不是质数也不是合数。inlineboolisprime(intx){for(inti=2;i<=x-1;++i){if(x%i==0)return0;return1;}}in......
  • (递归)算法
    递归条件:1.终止条件,当满足这个条件时,递归将停止并返回一个值,这个条件是为了防止函数无限递归,导致栈溢出。2.递归条件,这个是函数调用自身的地方,通常是通过将问题分解为更小的子问题来解决。例如求n的阶乘:deffactorial(n):#基线条件ifn==0:return1......
  • jsp飞机航班信息管理系统81e53
    jsp飞机航班信息管理系统81e本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表项目功能用户,航空公司,航班信息,机票订单,退订机票,航班进出场开题报告内容一、项目背景与目的随着全球航空业的快速发展,航班......
  • jsp仿小鹅通知识付费微网站r8aag
    jsp仿小鹅通知识付费微网站本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表项目功能用户,课程,培训课程,订单信息,作品分类,作品信息,书籍类型,书籍信息,购买订单开题报告内容一、项目背景随着互联网技术......