UNPKG

rabin-wasm

Version:

Rabin fingerprinting implemented in AssemblyScript

57 lines (51 loc) 1.55 kB
/** * Rabin fingerprinting * * @class Rabin */ class Rabin { /** * Creates an instance of Rabin. * @param { import("./../dist/rabin-wasm") } asModule * @param {number} [bits=12] * @param {number} [min=8 * 1024] * @param {number} [max=32 * 1024] * @param {number} polynomial * @memberof Rabin */ constructor(asModule, bits = 12, min = 8 * 1024, max = 32 * 1024, windowSize = 64, polynomial) { this.bits = bits this.min = min this.max = max this.asModule = asModule this.rabin = new asModule.Rabin(bits, min, max, windowSize, polynomial) this.polynomial = polynomial } /** * Fingerprints the buffer * * @param {Uint8Array} buf * @returns {Array<number>} * @memberof Rabin */ fingerprint(buf) { const { __retain, __release, __allocArray, __getInt32Array, Int32Array_ID, Uint8Array_ID } = this.asModule const lengths = new Int32Array(Math.ceil(buf.length/this.min)) const lengthsPtr = __retain(__allocArray(Int32Array_ID, lengths)) const pointer = __retain(__allocArray(Uint8Array_ID, buf)) const out = this.rabin.fingerprint(pointer, lengthsPtr) const processed = __getInt32Array(out) __release(pointer) __release(lengthsPtr) const end = processed.indexOf(0); return end >= 0 ? processed.subarray(0, end) : processed; } } module.exports = Rabin