rabin-wasm
Version:
Rabin fingerprinting implemented in AssemblyScript
57 lines (51 loc) • 1.55 kB
JavaScript
/**
* 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