UNPKG

thor-devkit

Version:

Typescript library to aid DApp development on VeChain Thor

65 lines 4.25 kB
import { blake2b256 } from './blake2b'; import { Buffer } from 'buffer'; /** * 2048 bits Bloom filter */ export class Bloom { /** estimate k(number of hash functions) according to item count */ static estimateK(itemCount) { const k = Math.round(this.BITS_LENGTH / itemCount * Math.LN2); return Math.max(Math.min(k, this.MAX_K), 1); } /** * new bloom filter instance * @param k number of hash functions * @param bits leave it out to construct an empty one */ constructor(k, bits) { if (bits) { this.bits = bits; } else { this.bits = Buffer.alloc(Bloom.BITS_LENGTH / 8); } this.k = k; } /** * add item * @param item */ add(item) { this.distribute(item, (index, bit) => { // tslint:disable-next-line:no-bitwise this.bits[index] |= bit; return true; }); } /** * test if an item contained. (false positive) * @param item */ test(item) { return this.distribute(item, (index, bit) => { // tslint:disable-next-line:no-bitwise return (this.bits[index] & bit) === bit; }); } distribute(item, cb) { const hash = blake2b256(item); for (let i = 0; i < this.k; i++) { // tslint:disable-next-line:no-bitwise const d = (hash[i * 2 + 1] + (hash[i * 2] << 8)) % Bloom.BITS_LENGTH; // tslint:disable-next-line:no-bitwise const bit = 1 << (d % 8); if (!cb(Math.floor(d / 8), bit)) { return false; } } return true; } } /** number of hash functions */ Bloom.MAX_K = 16; /** bit length */ Bloom.BITS_LENGTH = 2048; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvb20uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYmxvb20udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUN0QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBRS9COztHQUVHO0FBQ0gsTUFBTSxPQUFPLEtBQUs7SUFNZCxtRUFBbUU7SUFDNUQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxTQUFpQjtRQUNyQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUM3RCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQy9DLENBQUM7SUFLRDs7OztPQUlHO0lBQ0gsWUFBWSxDQUFTLEVBQUUsSUFBYTtRQUNoQyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ1AsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUE7UUFDcEIsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUNuRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDZCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksR0FBRyxDQUFDLElBQVk7UUFDbkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDakMsc0NBQXNDO1lBQ3RDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxDQUFBO1lBQ3ZCLE9BQU8sSUFBSSxDQUFBO1FBQ2YsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksSUFBSSxDQUFDLElBQVk7UUFDcEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUN4QyxzQ0FBc0M7WUFDdEMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFBO1FBQzNDLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUVPLFVBQVUsQ0FBQyxJQUFZLEVBQUUsRUFBMkM7UUFDeEUsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzdCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDOUIsc0NBQXNDO1lBQ3RDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQTtZQUNwRSxzQ0FBc0M7WUFDdEMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO1lBQ3hCLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDOUIsT0FBTyxLQUFLLENBQUE7WUFDaEIsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQTtJQUNmLENBQUM7O0FBL0RELCtCQUErQjtBQUNSLFdBQUssR0FBRyxFQUFFLENBQUE7QUFDakMsaUJBQWlCO0FBQ00saUJBQVcsR0FBRyxJQUFJLENBQUEifQ==