120 lines
3.6 KiB
JavaScript
120 lines
3.6 KiB
JavaScript
var bcoin = require('../').set('main');
|
|
var assert = require('assert');
|
|
|
|
describe('Bloom', function() {
|
|
this.timeout(20000);
|
|
|
|
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);
|
|
});
|
|
|
|
it('should test and add stuff', function() {
|
|
var b = new bcoin.bloom(512, 10, 156);
|
|
|
|
b.add('hello', 'ascii');
|
|
assert(b.test('hello', 'ascii'));
|
|
assert(!b.test('hello!', 'ascii'));
|
|
assert(!b.test('ping', 'ascii'));
|
|
|
|
b.add('hello!', 'ascii');
|
|
assert(b.test('hello!', 'ascii'));
|
|
assert(!b.test('ping', 'ascii'));
|
|
|
|
b.add('ping', 'ascii');
|
|
assert(b.test('ping', 'ascii'));
|
|
});
|
|
|
|
it('should test regular filter', function() {
|
|
var filter = bcoin.bloom.fromRate(210000, 0.00001, -1);
|
|
filter.tweak = 0xdeadbeef;
|
|
// ~1m operations
|
|
for (var i = 0; i < 1000; i++) {
|
|
var str = 'foobar' + i;
|
|
filter.add(str, 'ascii');
|
|
var j = i;
|
|
do {
|
|
var str = 'foobar' + j;
|
|
assert(filter.test(str, 'ascii') === true);
|
|
assert(filter.test(str + '-', 'ascii') === false);
|
|
} while (j--);
|
|
}
|
|
});
|
|
|
|
it('should test rolling filter', function() {
|
|
var filter = new bcoin.bloom.rolling(210000, 0.00001);
|
|
filter.tweak = 0xdeadbeef;
|
|
// ~1m operations
|
|
for (var i = 0; i < 1000; i++) {
|
|
var str = 'foobar' + i;
|
|
filter.add(str, 'ascii');
|
|
var j = i;
|
|
do {
|
|
var str = 'foobar' + j;
|
|
assert(filter.test(str, 'ascii') === true);
|
|
assert(filter.test(str + '-', 'ascii') === false);
|
|
} while (j--);
|
|
}
|
|
});
|
|
|
|
it('should handle rolling generations', function() {
|
|
var filter = new bcoin.bloom.rolling(50, 0.00001);
|
|
filter.tweak = 0xdeadbeee;
|
|
for (var i = 0; i < 25; i++) {
|
|
var str = 'foobar' + i;
|
|
filter.add(str, 'ascii');
|
|
var j = i;
|
|
do {
|
|
var str = 'foobar' + j;
|
|
assert(filter.test(str, 'ascii') === true);
|
|
assert(filter.test(str + '-', 'ascii') === false);
|
|
} while (j--);
|
|
}
|
|
for (var i = 25; i < 50; i++) {
|
|
var str = 'foobar' + i;
|
|
filter.add(str, 'ascii');
|
|
var j = i;
|
|
do {
|
|
var str = 'foobar' + j;
|
|
assert(filter.test(str, 'ascii') === true, str);
|
|
assert(filter.test(str + '-', 'ascii') === false, str);
|
|
} while (j--);
|
|
}
|
|
for (var i = 50; i < 75; i++) {
|
|
var str = 'foobar' + i;
|
|
filter.add(str, 'ascii');
|
|
var j = i;
|
|
do {
|
|
var str = 'foobar' + j;
|
|
assert(filter.test(str, 'ascii') === true, str);
|
|
assert(filter.test(str + '-', 'ascii') === false, str);
|
|
} while (j--);
|
|
}
|
|
for (var i = 75; i < 100; i++) {
|
|
var str = 'foobar' + i;
|
|
filter.add(str, 'ascii');
|
|
var j = i;
|
|
do {
|
|
var str = 'foobar' + j;
|
|
assert(filter.test(str, 'ascii') === true, str);
|
|
assert(filter.test(str + '-', 'ascii') === false, str);
|
|
} while (j-- > 25);
|
|
assert(filter.test('foobar 24', 'ascii') === false);
|
|
}
|
|
for (var i = 100; i < 125; i++) {
|
|
var str = 'foobar' + i;
|
|
filter.add(str, 'ascii');
|
|
var j = i;
|
|
do {
|
|
var str = 'foobar' + j;
|
|
assert(filter.test(str, 'ascii') === true, str);
|
|
assert(filter.test(str + '-', 'ascii') === false, str);
|
|
} while (j-- > 50);
|
|
}
|
|
assert(filter.test('foobar 49', 'ascii') === false);
|
|
});
|
|
});
|