libbf  0.1
 All Classes Functions Typedefs Friends Pages
a2.cc
1 #include <bf/bloom_filter/a2.h>
2 
3 #include <cassert>
4 
5 namespace bf {
6 
7 size_t a2_bloom_filter::k(double fp)
8 {
9  return std::floor(-std::log(1 - std::sqrt(1 - fp)) / std::log(2));
10 }
11 
12 size_t a2_bloom_filter::capacity(double fp, size_t cells)
13 {
14  return std::floor(cells / (2 * k(fp)) * std::log(2));
15 }
16 
17 
18 a2_bloom_filter::a2_bloom_filter(size_t k, size_t cells, size_t capacity,
19  size_t seed1, size_t seed2)
20  : first_(make_hasher(k, seed1), cells / 2),
21  second_(make_hasher(k, seed2), cells / 2),
22  capacity_(capacity)
23 {
24  assert(cells % 2 == 0);
25 }
26 
27 void a2_bloom_filter::add(object const& o)
28 {
29  if (first_.lookup(o))
30  return;
31  first_.add(o); // FIXME: do not hash object twice for better performance.
32  if (++items_ <= capacity_)
33  return;
34  items_ = 1;
35  second_.clear();
36  first_.swap(second_);
37  first_.add(o);
38 }
39 
40 size_t a2_bloom_filter::lookup(object const& o) const
41 {
42  auto r1 = first_.lookup(o);
43  return r1 > 0 ? r1 : second_.lookup(o);
44 }
45 
46 void a2_bloom_filter::clear()
47 {
48  first_.clear();
49  second_.clear();
50 }
51 
52 } // namespace bf