improve mm3 perf slightly.
This commit is contained in:
parent
819795b1ae
commit
c3822dbf70
@ -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();
|
||||
});
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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() {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user