diff options
-rw-r--r-- | src/common/bloom_filter.hpp | 22 | ||||
-rw-r--r-- | src/test/common/test_bloom_filter.cc | 8 |
2 files changed, 27 insertions, 3 deletions
diff --git a/src/common/bloom_filter.hpp b/src/common/bloom_filter.hpp index 3e55687774b..93787a89a60 100644 --- a/src/common/bloom_filter.hpp +++ b/src/common/bloom_filter.hpp @@ -101,8 +101,12 @@ public: void init() { generate_unique_salt(); - bit_table_ = new cell_type[table_size_]; - std::fill_n(bit_table_, table_size_, 0x00); + if (table_size_) { + bit_table_ = new cell_type[table_size_]; + std::fill_n(bit_table_, table_size_, 0x00); + } else { + bit_table_ = NULL; + } } bloom_filter(const bloom_filter& filter) @@ -137,7 +141,8 @@ public: inline void clear() { - std::fill_n(bit_table_, table_size_, 0x00); + if (bit_table_) + std::fill_n(bit_table_, table_size_, 0x00); insert_count_ = 0; } @@ -151,6 +156,7 @@ public: * @param val integer value to insert */ inline void insert(uint32_t val) { + assert(bit_table_); std::size_t bit_index = 0; std::size_t bit = 0; for (std::size_t i = 0; i < salt_.size(); ++i) @@ -163,6 +169,7 @@ public: inline void insert(const unsigned char* key_begin, const std::size_t& length) { + assert(bit_table_); std::size_t bit_index = 0; std::size_t bit = 0; for (std::size_t i = 0; i < salt_.size(); ++i) @@ -212,6 +219,8 @@ public: */ inline virtual bool contains(uint32_t val) const { + if (!bit_table_) + return false; std::size_t bit_index = 0; std::size_t bit = 0; for (std::size_t i = 0; i < salt_.size(); ++i) @@ -227,6 +236,8 @@ public: inline virtual bool contains(const unsigned char* key_begin, const std::size_t length) const { + if (!bit_table_) + return false; std::size_t bit_index = 0; std::size_t bit = 0; for (std::size_t i = 0; i < salt_.size(); ++i) @@ -305,6 +316,8 @@ public: */ inline double density() const { + if (!bit_table_) + return 0.0; size_t set = 0; uint8_t *p = bit_table_; size_t left = table_size_; @@ -605,6 +618,9 @@ public: inline bool compress(const double& target_ratio) { + if (!bit_table_) + return false; + if ((0.0 >= target_ratio) || (target_ratio >= 1.0)) { return false; diff --git a/src/test/common/test_bloom_filter.cc b/src/test/common/test_bloom_filter.cc index 71d3de97d2a..cfd41305caa 100644 --- a/src/test/common/test_bloom_filter.cc +++ b/src/test/common/test_bloom_filter.cc @@ -23,6 +23,14 @@ TEST(BloomFilter, Basic) { ASSERT_TRUE(bf.contains("bar")); } +TEST(BloomFilter, Empty) { + bloom_filter bf; + for (int i=0; i<100; ++i) { + ASSERT_FALSE(bf.contains(i)); + ASSERT_FALSE(bf.contains(stringify(i))); + } +} + TEST(BloomFilter, Sweep) { std::cout.setf(std::ios_base::fixed, std::ios_base::floatfield); std::cout.precision(5); |