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)
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;
}
* @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)
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)
*/
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)
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)
*/
inline double density() const
{
+ if (!bit_table_)
+ return 0.0;
size_t set = 0;
uint8_t *p = bit_table_;
size_t left = table_size_;
inline bool compress(const double& target_ratio)
{
+ if (!bit_table_)
+ return false;
+
if ((0.0 >= target_ratio) || (target_ratio >= 1.0))
{
return false;
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);