From 6eed52e05b697547105e7f6ab2419a3b1bf50189 Mon Sep 17 00:00:00 2001 From: Pieter Wuille Date: Mon, 27 Jul 2015 18:58:00 +0200 Subject: [PATCH] Only use randomly created nonces in CRollingBloomFilter. (cherry picked from commit d741371d7d27e228aa64c618c50b23fb5449c3e1) --- src/bloom.cpp | 13 ++++++------- src/bloom.h | 8 +++++--- src/test/bloom_tests.cpp | 6 +++--- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/bloom.cpp b/src/bloom.cpp index 89959d732..de8720659 100644 --- a/src/bloom.cpp +++ b/src/bloom.cpp @@ -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& vKey) @@ -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::max()); - + unsigned int nNewTweak = GetRand(std::numeric_limits::max()); b1.reset(nNewTweak); b2.reset(nNewTweak); nInsertions = 0; diff --git a/src/bloom.h b/src/bloom.h index 12bf6d99a..a4dba8cb4 100644 --- a/src/bloom.h +++ b/src/bloom.h @@ -116,15 +116,17 @@ public: 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& vKey); void insert(const uint256& hash); bool contains(const std::vector& vKey) const; bool contains(const uint256& hash) const; - void reset(unsigned int nNewTweak = 0); + void reset(); private: unsigned int nBloomSize; diff --git a/src/test/bloom_tests.cpp b/src/test/bloom_tests.cpp index d927be6b8..6b30d6aa8 100644 --- a/src/test/bloom_tests.cpp +++ b/src/test/bloom_tests.cpp @@ -469,7 +469,7 @@ static std::vector 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; @@ -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 @@ -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]); }