BloomFilter.js 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. var Class = require('./Class');
  2. var fill = require('./fill');
  3. var fnv1a = require('./fnv1a');
  4. var strHash = require('./strHash');
  5. var each = require('./each');
  6. var some = require('./some');
  7. exports = Class({
  8. initialize: function() {
  9. var size =
  10. arguments.length > 0 && arguments[0] !== undefined
  11. ? arguments[0]
  12. : 1024;
  13. var k =
  14. arguments.length > 1 && arguments[1] !== undefined
  15. ? arguments[1]
  16. : 3;
  17. this._buckets = fill(new Array(size), 0);
  18. this._k = k;
  19. this._size = size;
  20. },
  21. add: function(val) {
  22. var _this = this;
  23. each(this._locations(val), function(location) {
  24. return (_this._buckets[location] = 1);
  25. });
  26. },
  27. test: function(val) {
  28. var _this2 = this;
  29. return !some(this._locations(val), function(location) {
  30. return _this2._buckets[location] === 0;
  31. });
  32. },
  33. _locations: function(val) {
  34. var ret = [];
  35. var size = this._size;
  36. var a = fnv1a(val);
  37. var b = strHash(val);
  38. for (var i = 0; i < this._k; i++) {
  39. ret[i] = (a + b * i) % size;
  40. }
  41. return ret;
  42. }
  43. });
  44. module.exports = exports;