UNPKG

hash-maker

Version:

A collection of hash and number generators for Node or Browser

86 lines 2.99 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.randomBytes = void 0; class RANDOMXORSHIFT { constructor(seed) { var s; const mt = [0, 0, 0, 0]; if (seed == undefined) { seed = new Date().getTime(); } if (typeof Buffer !== 'undefined' && seed instanceof Buffer) { if (seed.length < 4) { throw new Error("Must be a seed Buffer of 4 bytes"); } mt[0] = seed.readUInt32LE() >>> 0; } else if (seed instanceof Uint8Array) { if (seed.length < 4) { throw new Error("Must be a seed Uint8Array of 4 bytes"); } mt[0] = ((seed[3] << 24) | (seed[2] << 16) | (seed[1] << 8) | seed[0]); } else if (typeof seed == "number") { mt[0] = seed >>> 0; } for (var i = 1; i < 5; i++) { s = mt[i - 1] ^ (mt[i - 1] >>> 30); mt[i] = (((((s & 0xffff0000) >>> 16) * 1812433253) << 16) + (s & 0x0000ffff) * 1812433253) + (i - 1); mt[i] >>>= 0; } mt.shift(); var result = new Uint8Array(16); mt.forEach((e, i) => { result[(i * 4)] = e & 0xFF; result[(i * 4) + 1] = (e >> 8) & 0xFF; result[(i * 4) + 2] = (e >> 16) & 0xFF; result[(i * 4) + 3] = (e >> 24) & 0xFF; }); this.mt = result; } /** * Generate a random unsigned 32 bit integer * @returns number */ random_int() { let v1 = ((this.mt[3] << 24) | (this.mt[2] << 16) | (this.mt[1] << 8) | this.mt[0]); let v4 = ((this.mt[15] << 24) | (this.mt[14] << 16) | (this.mt[13] << 8) | this.mt[12]); let comp_1 = (v4 ^ (v4 >>> 19) ^ v1 ^ (v1 << 11) ^ ((v1 ^ (v1 << 11)) >>> 8)) >>> 0; let new_value = new Uint8Array(4); new_value[0] = comp_1 & 0xFF; new_value[1] = (comp_1 >> 8) & 0xFF; new_value[2] = (comp_1 >> 16) & 0xFF; new_value[3] = (comp_1 >> 24) & 0xFF; const shift = this.mt.subarray(4, 16); var newBuffer = new Uint8Array([...shift, ...new_value]); this.mt = newBuffer; return comp_1; } } /** * Generate random bytes as Uint8Array or Buffer * * @param {number} number number bytes to create * @param {boolean} asBuffer - returns a Buffer else returns a Uint8Array * @returns Uint8Array or Buffer */ function randomBytes(number, asBuffer) { if (number == undefined || !(typeof number == "number")) { throw new Error("Must supply number of bytes to generate."); } const mt = new RANDOMXORSHIFT(); var array; if (asBuffer) { array = Buffer.alloc(number); } else { array = new Uint8Array(number); } for (let i = 0; i < number; i++) { array[i] = mt.random_int(); } return array; } exports.randomBytes = randomBytes; //# sourceMappingURL=randomBytes.js.map