UNPKG

1.46 kBJavaScriptView Raw
1"use strict";
2
3var BitBuffer = require('bitbuffer').BitBuffer
4var VNF = require('fnv').FNV
5
6function calculateSize(capacity, error_rate) {
7 var log2sq = 0.480453 /* Math.pow(Math.log(2), 2) */
8 return Math.ceil(capacity * Math.log(error_rate) / -log2sq)
9}
10
11function calculateSlices(size, capacity) {
12 return size / capacity * Math.log(2)
13}
14
15function calulateHashes(key, size, slices) {
16 /* See:
17 * "Less Hashing, Same Performance: Building a Better Bloom Filter"
18 * 2005, Adam Kirsch, Michael Mitzenmacher
19 * http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.72.2442
20 */
21 function fnv(seed, data) {
22 var h = new VNF()
23 h.update(seed)
24 h.update(data)
25 return h.value()
26 }
27 var h1 = fnv(Buffer("S"), key)
28 var h2 = fnv(Buffer("W"), key)
29 var hashes = []
30 for(var i = 0; i < slices; i++) {
31 hashes.push((h1 + i * h2) % size)
32 }
33 return hashes
34}
35
36function Bloem(size, slices) {
37 this.size = size
38 this.slices = slices
39 this.bitfield = new BitBuffer(size)
40}
41
42Bloem.prototype = {
43 add: function(key) {
44 var hashes = calulateHashes(key, this.size, this.slices)
45 for(var i = 0; i < hashes.length; i++) {
46 this.bitfield.set(hashes[i], true)
47 }
48 },
49 has: function(key) {
50 var hashes = calulateHashes(key, this.size, this.slices)
51 for(var i = 0; i < hashes.length; i++) {
52 if(!this.bitfield.get(hashes[i])) return false
53 }
54 return true
55 }
56}
57
58exports.Bloem = Bloem
59exports.calculateSize = calculateSize
60exports.calculateSlices = calculateSlices
\No newline at end of file