当前位置: 首页 > news >正文

Snowflake算法js(实现)

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 bitsif (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,并且非常适合分布式系统的场景。在实际部署时,请确保正确配置和同步时间,以避免潜在的问题。


http://www.mrgr.cn/news/50501.html

相关文章:

  • 无废话➕全干货之必备开题报告模板‼️
  • 三、Spring Boot集成Spring Security之过滤器链详解
  • win10/11 下安装Ubuntu 22.04(桌面版)双系统教程
  • STM32_实验2_printf函数重定向输出
  • 矩阵相关算法
  • 抖音电商推出运费险优惠 预计为商家一年降本超40亿元
  • ARM64使能kdump
  • 012集——CAD图中线段坐标导出到txt(CAD—C#二次开发入门)
  • 浅谈Java之接口
  • 【C】分支与循环1----if与switch
  • rust中编译宏控
  • AFSim仿真系统 --- 系统简解_11 行为与行为树
  • 苹果研究员质疑大模型!我们测试了6款,发现了4大真相
  • 病毒感染时间 题解 MarsCode
  • CST软件超表面--- 偏振片- 线圆极化转换,Floquet端口,S参数算轴比AR
  • GestaltMML——用于诊断罕见遗传疾病的多模态模型
  • 网站服务器监控:Lighttpd指标解读
  • numactl 设置 numa 内存分配规则
  • VUE项目基于源码实现可视化编程技术的探索
  • 【C语言教程】【常用类库】(十二)信号处理库 - <signal.h>