亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么使用javascript雪花算法生成隨機ID

發布時間:2022-11-09 17:38:36 來源:億速云 閱讀:308 作者:iii 欄目:編程語言

這篇文章主要介紹了怎么使用javascript雪花算法生成隨機ID的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇怎么使用javascript雪花算法生成隨機ID文章都會有所收獲,下面我們一起來看看吧。

1、snowflake-id插件 

import SnowflakeId from "snowflake-id";

const guid = num => {
  const id= new SnowflakeId();
  return id.generate();
};

2、原生使用 

var Snowflake = /** @class */ (function() {
  function Snowflake(_workerId, _dataCenterId, _sequence) {
    this.twepoch = 1288834974657n;
    //this.twepoch = 0n;
    this.workerIdBits = 5n;
    this.dataCenterIdBits = 5n;
    this.maxWrokerId = -1n ^ (-1n << this.workerIdBits); // 值為:31
    this.maxDataCenterId = -1n ^ (-1n << this.dataCenterIdBits); // 值為:31
    this.sequenceBits = 12n;
    this.workerIdShift = this.sequenceBits; // 值為:12
    this.dataCenterIdShift = this.sequenceBits + this.workerIdBits; // 值為:17
    this.timestampLeftShift = this.sequenceBits + this.workerIdBits + this.dataCenterIdBits; // 值為:22
    this.sequenceMask = -1n ^ (-1n << this.sequenceBits); // 值為:4095
    this.lastTimestamp = -1n;
    //設置默認值,從環境變量取
    this.workerId = 1n;
    this.dataCenterId = 1n;
    this.sequence = 0n;
    if(this.workerId > this.maxWrokerId || this.workerId < 0) {
      thrownew Error('_workerId must max than 0 and small than maxWrokerId-[' + this.maxWrokerId + ']');
    }
    if(this.dataCenterId > this.maxDataCenterId || this.dataCenterId < 0) {
      thrownew Error('_dataCenterId must max than 0 and small than maxDataCenterId-[' + this.maxDataCenterId + ']');
    }

    this.workerId = BigInt(_workerId);
    this.dataCenterId = BigInt(_dataCenterId);
    this.sequence = BigInt(_sequence);
  }
  Snowflake.prototype.tilNextMillis = function(lastTimestamp) {
    var timestamp = this.timeGen();
    while(timestamp <= lastTimestamp) {
      timestamp = this.timeGen();
    }
    return BigInt(timestamp);
  };
  Snowflake.prototype.timeGen = function() {
    return BigInt(Date.now());
  };
  Snowflake.prototype.nextId = function() {
    var timestamp = this.timeGen();
    if(timestamp < this.lastTimestamp) {
      thrownew Error('Clock moved backwards. Refusing to generate id for ' +
        (this.lastTimestamp - timestamp));
    }
    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;
  };
  return Snowflake;
}());

console.log(new Snowflake(1n, 1n, 0n).nextId());
//1141531990672150528n

控制臺輸出1141531990672150528n為bigint格式, .toString()轉為字符串格式即可

3、ES6使用

import bigInt from "big-integer";

const guid = () => {
  const Snowflake = /** @class */ (function() {
    function Snowflake(_workerId, _dataCenterId, _sequence) {
      // this.twepoch = 1288834974657;
      this.twepoch = 0;
      this.workerIdBits = 5;
      this.dataCenterIdBits = 5;
      this.maxWrokerId = -1 ^ (-1 << this.workerIdBits); // 值為:31
      this.maxDataCenterId = -1 ^ (-1 << this.dataCenterIdBits); // 值為:31
      this.sequenceBits = 12;
      this.workerIdShift = this.sequenceBits; // 值為:12
      this.dataCenterIdShift = this.sequenceBits + this.workerIdBits; // 值為:17
      this.timestampLeftShift = this.sequenceBits + this.workerIdBits + this.dataCenterIdBits; // 值為:22
      this.sequenceMask = -1 ^ (-1 << this.sequenceBits); // 值為:4095
      this.lastTimestamp = -1;
      //設置默認值,從環境變量取
      this.workerId = 1;
      this.dataCenterId = 1;
      this.sequence = 0;
      if (this.workerId > this.maxWrokerId || this.workerId < 0) {
        throw new Error(
          'config.worker_id must max than 0 and small than maxWrokerId-[' + this.maxWrokerId + ']'
        );
      }
      if (this.dataCenterId > this.maxDataCenterId || this.dataCenterId < 0) {
        throw new Error(
          'config.data_center_id must max than 0 and small than maxDataCenterId-[' +
            this.maxDataCenterId +
            ']'
        );
      }
      this.workerId = _workerId;
      this.dataCenterId = _dataCenterId;
      this.sequence = _sequence;
    }
    Snowflake.prototype.tilNextMillis = function(lastTimestamp) {
      var timestamp = this.timeGen();
      while (timestamp <= lastTimestamp) {
        timestamp = this.timeGen();
      }
      return timestamp;
    };
    Snowflake.prototype.timeGen = function() {
      //new Date().getTime() === Date.now()
      return Date.now();
    };
    Snowflake.prototype.nextId = function() {
      var timestamp = this.timeGen();
      if (timestamp < this.lastTimestamp) {
        throw new Error(
          'Clock moved backwards. Refusing to generate id for ' + (this.lastTimestamp - timestamp)
        );
      }
      if (this.lastTimestamp === timestamp) {
        this.sequence = (this.sequence + 1) & this.sequenceMask;
        if (this.sequence === 0) {
          timestamp = this.tilNextMillis(this.lastTimestamp);
        }
      } else {
        this.sequence = 0;
      }
      this.lastTimestamp = timestamp;
      var shiftNum =
        (this.dataCenterId << this.dataCenterIdShift) |
        (this.workerId << this.workerIdShift) |
        this.sequence; // dataCenterId:1,workerId:1,sequence:0  shiftNum:135168
      var nfirst = new bigInt(String(timestamp - this.twepoch), 10);
      nfirst = nfirst.shiftLeft(this.timestampLeftShift);
      var nnextId = nfirst.or(new bigInt(String(shiftNum), 10)).toString(10);
      return nnextId;
    };
    return Snowflake;
  })();

  return new Snowflake(1, 1, 0).nextId();
};

guid()即可調用

4、多次重復調用出現一樣id的bug

    console.log(guid(), new Date().getTime());
    console.log(guid(), new Date().getTime());
    console.log(guid(), new Date().getTime());
    console.log(guid(), new Date().getTime());
    console.log(guid(), new Date().getTime());
    console.log(guid(), new Date().getTime());
    console.log(guid(), new Date().getTime());
    console.log(guid(), new Date().getTime());
    console.log(guid(), new Date().getTime());
    console.log(guid(), new Date().getTime());
    console.log(guid(), new Date().getTime());
    console.log(guid(), new Date().getTime());

怎么使用javascript雪花算法生成隨機ID

修改如下

import SnowflakeId from "snowflake-id";

const guid = num => {
  const snowflake = new SnowflakeId();
  let arr = [];
  for (let i = 0; i < num; i++) {
    arr.push(snowflake.generate());
  }
  return num ? arr : snowflake.generate();
};

單個調用 guid()

n個調用 guid(n)

JavaScript有什么特點

1、js屬于一種解釋性腳本語言;

2、在絕大多數瀏覽器的支持下,js可以在多種平臺下運行,擁有著跨平臺特性;

3、js屬于一種弱類型腳本語言,對使用的數據類型未做出嚴格的要求,能夠進行類型轉換,簡單又容易上手;

4、js語言安全性高,只能通過瀏覽器實現信息瀏覽或動態交互,從而有效地防止數據的丟失;

5、基于對象的腳本語言,js不僅可以創建對象,也能使用現有的對象。

關于“怎么使用javascript雪花算法生成隨機ID”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“怎么使用javascript雪花算法生成隨機ID”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

华坪县| 通州市| 左贡县| 卓资县| 淮阳县| 思茅市| 沾益县| 安乡县| 连云港市| 沙田区| 玛多县| 鹤壁市| 三河市| 九龙坡区| 灯塔市| 达州市| 泸水县| 土默特左旗| 玛沁县| 巴林左旗| 缙云县| 衡东县| 万源市| 通州区| 法库县| 灵丘县| 娄烦县| 贵南县| 安义县| 漠河县| 祁连县| 大足县| 永吉县| 昆明市| 靖宇县| 兴业县| 阿巴嘎旗| 吉首市| 内丘县| 湘潭市| 陕西省|