TypeScript 8位(8 bytes)内容ID生成器

C 2023-5-21 1631

思路参照ObjectId:https://www.runoob.com/mongodb/mongodb-objectid.html

但是MongoDB已经修改了ObjectId生成逻辑,其中机器码和进程ID改为随机数,因为两者在不同机器上的重复概率很高。

我在其基础上进行了精简和修改:

前5位表示当前时间戳,最多支持3万多年的秒级计数,从公元0年开始计数。

后3位为递增数,每秒最多支持16777215个ID生成,已达到性能瓶颈。

如果后期需要对系统进行分布式改造,那么将后3位的递增数进行拆分。

在初始化时,给每台服务器分发不同的的递增ID范围,这样可确保生成ID非重复。

当然所有递增ID加起来肯定也不能超过16777215这个极限,每秒生成这么多内容够用了。

最后将这个ID封装成恰好8位的BigInt类型,然后存储进KV(大部分Key支持Int64)。

 

class Aid {
  private static _ = 0;
  static bin(): string {
    if (this._ >= 10000000) { this._ = 0; }
    this._++;
    return (Math.round(Date.now() / 1000) + 62167219200).toString(2).padStart(40, '0') + this._.toString(2).padStart(24, '0');
  }
  static big(): bigint {
    return BigInt('0b' + this.bin());
  }
}
最新回复 (0)
    • 屌丝论坛
      2