首页
学习
活动
专区
圈层
工具
发布

js雪花代码

JavaScript中的“雪花代码”通常指的是一种用于生成唯一标识符(ID)的算法,类似于Twitter的Snowflake算法。这种算法可以在分布式系统中生成全局唯一的ID,而不需要中央协调器。以下是关于雪花代码的基础概念、优势、类型、应用场景以及可能遇到的问题和解决方案。

基础概念

雪花算法生成的ID是一个64位的整数,通常由以下部分组成:

  • 时间戳:41位,精确到毫秒,可以使用约69年。
  • 机器ID:10位,可以部署在1024个节点上。
  • 序列号:12位,每毫秒每个节点可以生成4096个ID。

优势

  1. 全局唯一性:即使在分布式系统中也能保证ID的唯一性。
  2. 高性能:生成ID的过程非常快速,适合高并发场景。
  3. 有序性:生成的ID按时间有序,便于排序和查询。

类型

  • Twitter Snowflake:最经典的实现。
  • 自定义Snowflake:根据具体需求调整各部分位数。

应用场景

  • 数据库主键:确保每条记录的ID唯一且有序。
  • 消息队列:为每条消息生成唯一标识。
  • 分布式缓存:作为缓存的键值。

示例代码

以下是一个简单的JavaScript实现雪花算法的例子:

代码语言:txt
复制
class Snowflake {
  constructor(workerId, datacenterId, sequence = 0) {
    this.twepoch = 1288834974657n;
    this.workerIdBits = 5n;
    this.datacenterIdBits = 5n;
    this.maxWorkerId = -1n ^ (-1n << this.workerIdBits);
    this.maxDatacenterId = -1n ^ (-1n << this.datacenterIdBits);
    this.sequenceBits = 12n;

    this.workerIdShift = this.sequenceBits;
    this.datacenterIdShift = this.sequenceBits + this.workerIdBits;
    this.timestampLeftShift = this.sequenceBits + this.workerIdBits + this.datacenterIdBits;
    this.sequenceMask = -1n ^ (-1n << this.sequenceBits);

    if (workerId > this.maxWorkerId || workerId < 0) {
      throw new Error(`workerId can't be greater than ${this.maxWorkerId} or less than 0`);
    }
    if (datacenterId > this.maxDatacenterId || datacenterId < 0) {
      throw new Error(`datacenterId can't be greater than ${this.maxDatacenterId} or less than 0`);
    }

    this.workerId = BigInt(workerId);
    this.datacenterId = BigInt(datacenterId);
    this.sequence = BigInt(sequence);

    this.lastTimestamp = -1n;
  }

  tilNextMillis(lastTimestamp) {
    let timestamp = this.timeGen();
    while (timestamp <= lastTimestamp) {
      timestamp = this.timeGen();
    }
    return BigInt(timestamp);
  }

  timeGen() {
    return BigInt(Date.now());
  }

  nextId() {
    let timestamp = this.timeGen();

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

    if (this.lastTimestamp === timestamp) {
      this.sequence = (this.sequence + 1n) & this.sequenceMask;
      if (this.sequence === 0n) {
        timestamp = this.tilNextMillis(this.lastTimestamp);
      }
    } else {
      this.sequence = 0n;
    }

    this.lastTimestamp = timestamp;

    return ((timestamp - this.twepoch) << this.timestampLeftShift) |
           (this.datacenterId << this.datacenterIdShift) |
           (this.workerId << this.workerIdShift) |
           this.sequence;
  }
}

// Usage
const snowflake = new Snowflake(1, 1);
console.log(snowflake.nextId());

可能遇到的问题和解决方案

问题1:时钟回拨

  • 原因:服务器时间被调整到过去。
  • 解决方案:在生成ID时检查时间戳是否小于上次记录的时间戳,如果是,则等待直到时间追上。

问题2:ID重复

  • 原因:在同一毫秒内生成的ID超过了4096个,或者机器ID配置错误。
  • 解决方案:确保每台机器的ID唯一,并且在高并发情况下适当增加序列号的位数。

通过以上信息,你应该能够理解雪花代码的基本概念、优势、应用场景以及如何处理常见问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

冬天过节网站雪花飘落代码JS特效代码下载 雪花飘落代码添加教程 5种效果+效果展示

特别是与冬天季节相关的主题,很多的博客空间都加了雪花的效果。在网上搜索了几种雪花效果,做了简单的修改,在这里给大家分享下。将代码添加到你的页面就可以了。...以下js文件中可以自行调整雪花大小,也可自行更换雪花样式 如果觉得代码大小合适 可以直接网站引用插入网站底部后即可 依赖 JQurey,如果没效果,请确认网页是否已载入 JQurey...很简单,在浏览器按下 F12,然后在 console 里面粘贴一下 JS 代码(不含前后的 script 标签),然后回车执行即可看到效果 唯美浪漫雪花飘落jquery特效代码 代码添加如下: <script...演示页面: 代码添加如下: 隐藏内容 评论可见 前往评论 html5 canvas制作3D逼真冬天雪景雪花飘场景 演示页面: 代码添加如下: 平安夜/圣诞夜jquery snow.js雪花飘落效果...> html5 canvas散开变大雪花动画特效  演示页面: 以上是使用javascript实现雪花飘落的效果代码,可以直接引用即可 可以根据个人喜爱修改,更多好看网页雪花特效代码欢迎分享。

10.8K30
  • 为Zblog、WordPress等网站添加JS纯代码雪花飘落效果

    现在冬天下雪已经是很常见的事情了,为了应景,我们可以为我们的网站增加雪花飘落的效果,这个应该还是很不错的。实现的方法还是比较简单的,只需要简单的三步就可以了,现将方法分享一下。...效果展示 很简单,在浏览器按下 F12,然后在 console 里面粘贴一下 JS 代码(不含前后的 script 标签),然后回车执行即可看到效果 下面是5种效果 直接引用即可 冬天过节网站雪花飘落代码...JS特效 添加教程 5种效果+效果展示 雪花飘落效果 (function($){    $.fn.snow = function(options...minSize   : 10,       maxSize   : 20,       newOn     : 1000,       flakeColor : "#AFDAEF" /* 此处可以定义雪花颜色... */        maxSize: 50,/* 定义雪花最大尺寸 */        newOn: 300  /* 定义密集程度,数字越小越密集 */     }); });

    3.1K10

    雪花算法snowflake

    雪花算法。百度UidGenerator算法(基于雪花算法实现自定义时间戳)。美团Leaf算法(依赖于数据库,ZK)。...雪花算法的结构:图片主要分为 4 个部分:是 1 个 bit:0,这个是无意义的。是 41 个 bit:表示的是时间戳。...代码实现:  代码中将 10 bit 拆分成 5bit表示工作机器ID,5bit表示数据中心IDpackage com.example.demo.snowflake;public class SnowflakeIdWorker...** 而对于不重复且是自增的,那么我们是很容易想到的是时间,而雪花算法就是基于时间戳。但是毫秒级的并发下如果直接拿来用,显然是不合理的。那么我们就要在这个时间戳上面做一些文章。...可以看到雪花算法中是基于 synchronized 锁进行实现的。如果小伙伴们有其他更好的想法请在下方留言哦。

    1.9K10

    雪花算法Snowflake

    以下文章来源于智能大石头 ,作者智能大石头 雪花Id生成算法,是鼎鼎有名的分布式Id生成算法。它的优点在于,在分布式系统中快速生成有时间顺序的唯一编号!...以下是采用雪花Id作为订单号。 解析Id 大型数据表,例如订单表、日志表等,可以使用Int64作为主键,然后使用雪花Id。...因为雪花Id内带有时间戳信息,因此我们可以根据主键Id来直接搜索指定时间区间的数据。 /// 时间转为Id,不带节点和序列号。...星尘大量使用雪花Id,用于存储跟踪数据和采样数据,以前必须先插入跟踪数据得到自增Id然后才能插入采样数据(需要关联)的问题迎难而解,两者都可以同时走批量插入。...对于日志型数据表,强烈推荐使用雪花Id,因为它带有时间戳信息,等同于省去了CreateTime字段的索引。

    1.6K20

    雪花ID应用分享

    话说上次分享了《关于大数据那些事》有朋友私信跟我聊了一下ID增加的事情,他不是很明白为什么不自增或GUID,因为这样就十分简单并且可取,而采用所谓的雪花ID,好像很复杂。。...既然你能在数据库中建立GUID的字段为什么不善用数据库字段充份用好,这个时候就是雪花ID上场的时候,首先雪花ID不存在像自增ID这样容易被调用因为他是18位数字,你去猜把18位猜一整天也未必能猜到,因为是有算法的...说了这么就让我们来看看怎么做,上代码。...这个是引用雪花ID方法: var snowflakeId = new SnowFlakeId(2, 5);//2 dataCenterId 数据中心ID,5 workerId 机器ID var id =...下面这个就是雪花ID的类: using System; using System.Runtime.InteropServices; namespace TanGuangjian_Qcloud {

    2.1K41
    领券