thor-devkit
Version:
Typescript library to aid DApp development on VeChain Thor
65 lines • 4.19 kB
JavaScript
import { blake2b256 } from './blake2b';
import { Buffer } from 'buffer';
/**
* 2048 bits Bloom filter
*/
export class Bloom {
/**
* 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;
}
/** 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);
}
/**
* 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvb20uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYmxvb20udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUN0QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBRS9COztHQUVHO0FBQ0gsTUFBTSxPQUFPLEtBQUs7SUFlZDs7OztPQUlHO0lBQ0gsWUFBWSxDQUFTLEVBQUUsSUFBYTtRQUNoQyxJQUFJLElBQUksRUFBRTtZQUNOLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFBO1NBQ25CO2FBQU07WUFDSCxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQTtTQUNsRDtRQUNELElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ2QsQ0FBQztJQXJCRCxtRUFBbUU7SUFDNUQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxTQUFpQjtRQUNyQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUM3RCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQy9DLENBQUM7SUFtQkQ7OztPQUdHO0lBQ0ksR0FBRyxDQUFDLElBQVk7UUFDbkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDakMsc0NBQXNDO1lBQ3RDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxDQUFBO1lBQ3ZCLE9BQU8sSUFBSSxDQUFBO1FBQ2YsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksSUFBSSxDQUFDLElBQVk7UUFDcEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUN4QyxzQ0FBc0M7WUFDdEMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFBO1FBQzNDLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUVPLFVBQVUsQ0FBQyxJQUFZLEVBQUUsRUFBMkM7UUFDeEUsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzdCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzdCLHNDQUFzQztZQUN0QyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUE7WUFDcEUsc0NBQXNDO1lBQ3RDLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtZQUN4QixJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFO2dCQUM3QixPQUFPLEtBQUssQ0FBQTthQUNmO1NBQ0o7UUFDRCxPQUFPLElBQUksQ0FBQTtJQUNmLENBQUM7O0FBL0RELCtCQUErQjtBQUNSLFdBQUssR0FBRyxFQUFFLENBQUE7QUFDakMsaUJBQWlCO0FBQ00saUJBQVcsR0FBRyxJQUFJLENBQUEifQ==