⚡ Snowflake generate improve performance with BigInt
This commit is contained in:
parent
d2795bdd0a
commit
ddfa1de983
@ -10,10 +10,10 @@
|
|||||||
* A container for useful snowflake-related methods.
|
* A container for useful snowflake-related methods.
|
||||||
*/
|
*/
|
||||||
export class Snowflake {
|
export class Snowflake {
|
||||||
static EPOCH = 1420070400000;
|
static readonly EPOCH = 1420070400000n;
|
||||||
static INCREMENT = 0;
|
static INCREMENT = 0n; // max 4095
|
||||||
static processId = 0;
|
static processId = 0n; // max 31
|
||||||
static workerId = 0;
|
static workerId = 0n; // max 31
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
throw new Error(`The ${this.constructor.name} class may not be instantiated.`);
|
throw new Error(`The ${this.constructor.name} class may not be instantiated.`);
|
||||||
@ -82,27 +82,12 @@ export class Snowflake {
|
|||||||
return dec;
|
return dec;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
static generate() {
|
||||||
* Generates a Discord snowflake.
|
var time = BigInt(Date.now() - Snowflake.EPOCH) << 22n;
|
||||||
* <info>This hardcodes the worker ID as 1 and the process ID as 0.</info>
|
var worker = Snowflake.workerId << 17n;
|
||||||
* @param {number|Date} [timestamp=Date.now()] Timestamp or date of the snowflake to generate
|
var process = Snowflake.processId << 12n;
|
||||||
* @returns {Snowflake} The generated snowflake
|
var increment = Snowflake.INCREMENT++;
|
||||||
*/
|
return (time | worker | process | increment).toString(10);
|
||||||
static generate(timestamp = Date.now()) {
|
|
||||||
if (timestamp instanceof Date) timestamp = timestamp.getTime();
|
|
||||||
if (typeof timestamp !== "number" || isNaN(timestamp)) {
|
|
||||||
throw new TypeError(
|
|
||||||
`"timestamp" argument must be a number (received ${isNaN(timestamp) ? "NaN" : typeof timestamp})`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if (Snowflake.INCREMENT >= 4095) Snowflake.INCREMENT = 0;
|
|
||||||
let workerBin = Snowflake.workerId.toString(2).padStart(5, "0");
|
|
||||||
let processBin = Snowflake.processId.toString(2).padStart(5, "0");
|
|
||||||
|
|
||||||
const BINARY = `${(timestamp - EPOCH)
|
|
||||||
.toString(2)
|
|
||||||
.padStart(42, "0")}${workerBin}${processBin}${(Snowflake.INCREMENT++).toString(2).padStart(12, "0")}`;
|
|
||||||
return Snowflake.binaryToID(BINARY);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -138,13 +123,4 @@ export class Snowflake {
|
|||||||
});
|
});
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Discord's epoch value (2015-01-01T00:00:00.000Z).
|
|
||||||
* @type {number}
|
|
||||||
* @readonly
|
|
||||||
*/
|
|
||||||
static get EPOCH() {
|
|
||||||
return EPOCH;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user