From d8800632ea11b652fbb042d01b3f0ae0fe5c566b Mon Sep 17 00:00:00 2001 From: Christopher Jeffrey Date: Fri, 20 May 2016 16:03:07 -0700 Subject: [PATCH] optimize new generations with rolling filter. --- lib/bcoin/bloom.js | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/lib/bcoin/bloom.js b/lib/bcoin/bloom.js index cd0825d3..fc86c1d5 100644 --- a/lib/bcoin/bloom.js +++ b/lib/bcoin/bloom.js @@ -255,6 +255,7 @@ RollingFilter.prototype.reset = function reset() { RollingFilter.prototype.add = function add(val, enc) { var i, j, hash, bits, pos, pos1, pos2, bit, oct; + var m1, m2, v1, v2, mhi, mlo; if (typeof val === 'string') val = new Buffer(val, enc); @@ -266,19 +267,22 @@ RollingFilter.prototype.add = function add(val, enc) { if (this.generation === 4) this.generation = 1; + m1 = (this.generation & 1) * 0xffffffff; + m2 = (this.generation >>> 1) * 0xffffffff; + for (i = 0; i < this.items; i += 2) { pos1 = i * 8; pos2 = (i + 1) * 8; - for (j = 0; j < 64; j++) { - bit = j % 8; - oct = (j - bit) / 8; - bits = (this.filter[pos1 + oct] >>> bit) & 1; - bits |= ((this.filter[pos2 + oct] >>> bit) & 1) << 1; - if (bits === this.generation) { - this.filter[pos1 + oct] &= ~((this.generation & 1) << bit); - this.filter[pos2 + oct] &= ~((this.generation >>> 1) << bit); - } - } + v1 = read(this.filter, pos1); + v2 = read(this.filter, pos2); + mhi = (v1.hi ^ m1) | (v2.hi ^ m2); + mlo = (v1.lo ^ m1) | (v2.lo ^ m2); + v1.hi &= mhi; + v1.lo &= mlo; + v2.hi &= mhi; + v2.lo &= mlo; + write(this.filter, v1, pos1); + write(this.filter, v2, pos2); } } @@ -459,6 +463,18 @@ function rotl32(w, b) { return (w << b) | (w >>> (32 - b)); } +function read(data, off) { + return { + hi: data.readUInt32LE(off + 4, true), + lo: data.readUInt32LE(off, true) + }; +} + +function write(data, value, off) { + data.writeUInt32LE(value.hi, off + 4, true); + data.writeUInt32LE(value.lo, off, true); +} + /* * Expose */