improve mm3 perf slightly.

This commit is contained in:
Christopher Jeffrey 2016-06-03 11:16:26 -07:00
parent 819795b1ae
commit c3822dbf70
No known key found for this signature in database
GPG Key ID: 8962AB9DE6666BBD
3 changed files with 67 additions and 46 deletions

View File

@ -18,5 +18,12 @@ node.open(function(err) {
if (err)
throw err;
if (process.argv.indexOf('--test') !== -1) {
node.pool.watchAddress('1VayNert3x1KzbpzMGt2qdqrAThiRovi8');
node.on('tx', function(tx) {
utils.print(tx);
});
}
node.startSync();
});

View File

@ -369,58 +369,50 @@ RollingFilter.prototype.added = function added(val, enc) {
*/
function murmur3(data, seed) {
var tail = data.length - (data.length % 4);
var c1 = 0xcc9e2d51;
var c2 = 0x1b873593;
var r1 = 15;
var r2 = 13;
var m = 5;
var n = 0xe6546b64;
var hash = seed;
var i, w, r, j;
var h1 = seed;
var i, k1;
assert(Buffer.isBuffer(data));
for (i = 0; i + 4 <= data.length; i += 4) {
w = data[i]
| (data[i + 1] << 8)
for (i = 0; i < tail; i += 4) {
k1 = (data[i + 3] << 24)
| (data[i + 2] << 16)
| (data[i + 3] << 24);
w = mul32(w, c1);
w = rotl32(w, r1);
w = mul32(w, c2);
hash ^= w;
hash = rotl32(hash, r2);
hash = mul32(hash, m);
hash = sum32(hash, n);
| (data[i + 1] << 8)
| data[i];
k1 = mul32(k1, c1);
k1 = rotl32(k1, 15);
k1 = mul32(k1, c2);
h1 ^= k1;
h1 = rotl32(h1, 13);
h1 = sum32(mul32(h1, 5), 0xe6546b64);
}
if (i !== data.length) {
r = 0;
for (j = data.length - 1; j >= i; j--)
r = (r << 8) | data[j];
r = mul32(r, c1);
r = rotl32(r, r1);
if (r < 0)
r += 0x100000000;
r = mul32(r, c2);
hash ^= r;
k1 = 0;
switch (data.length & 3) {
case 3:
k1 ^= data[tail + 2] << 16;
case 2:
k1 ^= data[tail + 1] << 8;
case 1:
k1 ^= data[tail + 0];
k1 = mul32(k1, c1);
k1 = rotl32(k1, 15);
k1 = mul32(k1, c2);
h1 ^= k1;
}
hash ^= data.length;
hash ^= hash >>> 16;
hash = mul32(hash, 0x85ebca6b);
hash ^= hash >>> 13;
hash = mul32(hash, 0xc2b2ae35);
hash ^= hash >>> 16;
h1 ^= data.length;
h1 ^= h1 >>> 16;
h1 = mul32(h1, 0x85ebca6b);
h1 ^= h1 >>> 13;
h1 = mul32(h1, 0xc2b2ae35);
h1 ^= h1 >>> 16;
if (hash < 0)
hash += 0x100000000;
if (h1 < 0)
h1 += 0x100000000;
return hash;
return h1;
}
function mul32(a, b) {

View File

@ -14,10 +14,32 @@ describe('Bloom', function() {
it('should do proper murmur3', function() {
var murmur3 = bcoin.bloom.murmur3;
assert.equal(murmur3(new Buffer('', 'ascii'), 0), 0);
assert.equal(murmur3(new Buffer('', 'ascii'), 0xfba4c795), 0x6a396f08);
assert.equal(murmur3(new Buffer('00', 'ascii'), 0xfba4c795), 0x2a101837);
assert.equal(murmur3(new Buffer('hello world', 'ascii'), 0), 0x5e928f0f);
function mm(str, seed, expect, enc) {
assert.equal(murmur3(new Buffer(str, enc || 'ascii'), seed), expect);
}
mm('', 0, 0);
mm('', 0xfba4c795, 0x6a396f08);
mm('00', 0xfba4c795, 0x2a101837);
mm('hello world', 0, 0x5e928f0f);
mm('', 0x00000000, 0x00000000, 'hex');
mm('', 0xfba4c795, 0x6a396f08, 'hex');
mm('', 0xffffffff, 0x81f16f39, 'hex');
mm('00', 0x00000000, 0x514e28b7, 'hex');
mm('00', 0xfba4c795, 0xea3f0b17, 'hex');
mm('ff', 0x00000000, 0xfd6cf10d, 'hex');
mm('0011', 0x00000000, 0x16c6b7ab, 'hex');
mm('001122', 0x00000000, 0x8eb51c3d, 'hex');
mm('00112233', 0x00000000, 0xb4471bf8, 'hex');
mm('0011223344', 0x00000000, 0xe2301fa8, 'hex');
mm('001122334455', 0x00000000, 0xfc2e4a15, 'hex');
mm('00112233445566', 0x00000000, 0xb074502c, 'hex');
mm('0011223344556677', 0x00000000, 0x8034d2a0, 'hex');
mm('001122334455667788', 0x00000000, 0xb4698def, 'hex');
});
it('should test and add stuff', function() {