aboutsummaryrefslogtreecommitdiff
path: root/src/bloom.cpp
diff options
context:
space:
mode:
authorPeter Todd <pete@petertodd.org>2015-07-20 04:43:34 +0900
committerPieter Wuille <pieter.wuille@gmail.com>2015-07-27 18:38:49 +0200
commitd2d7ee0e863b286e1c9f9c54659d494fb0a7712d (patch)
treeb955db39fbb776cb59777a1ac171b4cd842496ec /src/bloom.cpp
parenta3d65fedaa18686f0cc007d0a13dba6545250300 (diff)
downloadbitcoin-d2d7ee0e863b286e1c9f9c54659d494fb0a7712d.tar.xz
Make CRollingBloomFilter set nTweak for you
While CBloomFilter is usually used with an explicitly set nTweak, CRollingBloomFilter is only used internally. Requiring every caller to set nTweak is error-prone and redundant; better to have the class handle that for you with a high-quality randomness source. Additionally when clearing the filter it makes sense to change nTweak as well to recover from a bad setting, e.g. due to insufficient randomness at initialization, so the clear() method is replaced by a reset() method that sets a new, random, nTweak value.
Diffstat (limited to 'src/bloom.cpp')
-rw-r--r--src/bloom.cpp19
1 files changed, 15 insertions, 4 deletions
diff --git a/src/bloom.cpp b/src/bloom.cpp
index 3f50b1da91..89959d7326 100644
--- a/src/bloom.cpp
+++ b/src/bloom.cpp
@@ -8,6 +8,7 @@
#include "hash.h"
#include "script/script.h"
#include "script/standard.h"
+#include "random.h"
#include "streams.h"
#include <math.h>
@@ -121,6 +122,12 @@ void CBloomFilter::clear()
isEmpty = true;
}
+void CBloomFilter::reset(unsigned int nNewTweak)
+{
+ clear();
+ nTweak = nNewTweak;
+}
+
bool CBloomFilter::IsWithinSizeConstraints() const
{
return vData.size() <= MAX_BLOOM_FILTER_SIZE && nHashFuncs <= MAX_HASH_FUNCS;
@@ -217,7 +224,8 @@ CRollingBloomFilter::CRollingBloomFilter(unsigned int nElements, double fpRate,
// inserted, so at least one always contains the last nElements
// inserted.
nBloomSize = nElements * 2;
- nInsertions = 0;
+
+ reset(nTweak);
}
void CRollingBloomFilter::insert(const std::vector<unsigned char>& vKey)
@@ -254,9 +262,12 @@ bool CRollingBloomFilter::contains(const uint256& hash) const
return contains(data);
}
-void CRollingBloomFilter::clear()
+void CRollingBloomFilter::reset(unsigned int nNewTweak)
{
- b1.clear();
- b2.clear();
+ if (!nNewTweak)
+ nNewTweak = GetRand(std::numeric_limits<unsigned int>::max());
+
+ b1.reset(nNewTweak);
+ b2.reset(nNewTweak);
nInsertions = 0;
}