Skip to content

Commit

Permalink
Only use randomly created nonces in CRollingBloomFilter.
Browse files Browse the repository at this point in the history
  • Loading branch information
sipa committed Jul 27, 2015
1 parent d2d7ee0 commit d741371
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 13 deletions.
13 changes: 6 additions & 7 deletions src/bloom.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -216,16 +216,17 @@ void CBloomFilter::UpdateEmptyFull()
isEmpty = empty;
}

CRollingBloomFilter::CRollingBloomFilter(unsigned int nElements, double fpRate, unsigned int nTweak) :
b1(nElements * 2, fpRate, nTweak), b2(nElements * 2, fpRate, nTweak)
CRollingBloomFilter::CRollingBloomFilter(unsigned int nElements, double fpRate) :
b1(nElements * 2, fpRate, 0), b2(nElements * 2, fpRate, 0)
{
// Implemented using two bloom filters of 2 * nElements each.
// We fill them up, and clear them, staggered, every nElements
// inserted, so at least one always contains the last nElements
// inserted.
nInsertions = 0;
nBloomSize = nElements * 2;

reset(nTweak);
reset();
}

void CRollingBloomFilter::insert(const std::vector<unsigned char>& vKey)
Expand Down Expand Up @@ -262,11 +263,9 @@ bool CRollingBloomFilter::contains(const uint256& hash) const
return contains(data);
}

void CRollingBloomFilter::reset(unsigned int nNewTweak)
void CRollingBloomFilter::reset()
{
if (!nNewTweak)
nNewTweak = GetRand(std::numeric_limits<unsigned int>::max());

unsigned int nNewTweak = GetRand(std::numeric_limits<unsigned int>::max());
b1.reset(nNewTweak);
b2.reset(nNewTweak);
nInsertions = 0;
Expand Down
8 changes: 5 additions & 3 deletions src/bloom.h
Original file line number Diff line number Diff line change
Expand Up @@ -116,15 +116,17 @@ class CBloomFilter
class CRollingBloomFilter
{
public:
CRollingBloomFilter(unsigned int nElements, double nFPRate,
unsigned int nTweak = 0);
// A random bloom filter calls GetRand() at creation time.
// Don't create global CRollingBloomFilter objects, as they may be
// constructed before the randomizer is properly initialized.
CRollingBloomFilter(unsigned int nElements, double nFPRate);

void insert(const std::vector<unsigned char>& vKey);
void insert(const uint256& hash);
bool contains(const std::vector<unsigned char>& vKey) const;
bool contains(const uint256& hash) const;

void reset(unsigned int nNewTweak = 0);
void reset();

private:
unsigned int nBloomSize;
Expand Down
6 changes: 3 additions & 3 deletions src/test/bloom_tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -469,7 +469,7 @@ static std::vector<unsigned char> RandomData()
BOOST_AUTO_TEST_CASE(rolling_bloom)
{
// last-100-entry, 1% false positive:
CRollingBloomFilter rb1(100, 0.01, 1);
CRollingBloomFilter rb1(100, 0.01);

// Overfill:
static const int DATASIZE=399;
Expand Down Expand Up @@ -500,7 +500,7 @@ BOOST_AUTO_TEST_CASE(rolling_bloom)
BOOST_CHECK(nHits < 175);

BOOST_CHECK(rb1.contains(data[DATASIZE-1]));
rb1.reset(1);
rb1.reset();
BOOST_CHECK(!rb1.contains(data[DATASIZE-1]));

// Now roll through data, make sure last 100 entries
Expand All @@ -527,7 +527,7 @@ BOOST_AUTO_TEST_CASE(rolling_bloom)
BOOST_CHECK(nHits < 100);

// last-1000-entry, 0.01% false positive:
CRollingBloomFilter rb2(1000, 0.001, 1);
CRollingBloomFilter rb2(1000, 0.001);
for (int i = 0; i < DATASIZE; i++) {
rb2.insert(data[i]);
}
Expand Down

0 comments on commit d741371

Please sign in to comment.