From: <arn...@us...> - 2007-12-20 10:02:21
|
Revision: 947 http://dcplusplus.svn.sourceforge.net/dcplusplus/?rev=947&view=rev Author: arnetheduck Date: 2007-12-20 02:02:19 -0800 (Thu, 20 Dec 2007) Log Message: ----------- Bloom fixes Modified Paths: -------------- dcplusplus/trunk/dcpp/HashBloom.cpp Modified: dcplusplus/trunk/dcpp/HashBloom.cpp =================================================================== --- dcplusplus/trunk/dcpp/HashBloom.cpp 2007-12-17 23:14:47 UTC (rev 946) +++ dcplusplus/trunk/dcpp/HashBloom.cpp 2007-12-20 10:02:19 UTC (rev 947) @@ -6,14 +6,10 @@ namespace dcpp { size_t HashBloom::get_k(size_t n) { - const size_t bits = TTHValue::SIZE * 8; - for(size_t k = static_cast<size_t>(sqrt(bits)); k > 1; --k) { - // We only want the k's where the bits will end up on a byte boundary to ease hash implementation - if((bits % k) == 0 && (bits / k) % 8 == 0) { - uint64_t m = get_m(n, k); - if(m >> (TTHValue::SIZE * 8 / k) == 0) { - return k; - } + for(size_t k = TTHValue::SIZE/3; k > 1; --k) { + uint64_t m = get_m(n, k); + if(m >> 24 == 0) { + return k; } } return 1; @@ -32,7 +28,7 @@ bool HashBloom::match(const TTHValue& tth) const { if(bloom.empty()) { - return true; + return false; } for(size_t i = 0; i < k; ++i) { if(!bloom[pos(tth, i)]) { @@ -52,17 +48,21 @@ } size_t HashBloom::pos(const TTHValue& tth, size_t n) const { - return (*(size_t*)(tth.data + (TTHValue::SIZE / k) * n )) % bloom.size(); + uint32_t x = 0; + for(size_t i = n*3; i < TTHValue::SIZE; i += 3*k) { + x ^= static_cast<uint32_t>(tth.data[i]) << 2*8; + x ^= static_cast<uint32_t>(tth.data[i+1]) << 8; + x ^= static_cast<uint32_t>(tth.data[i+2]); + } + + return x % bloom.size(); } void HashBloom::copy_to(ByteVector& v) const { - size_t ones = 0; v.resize(bloom.size() / 8); for(size_t i = 0; i < bloom.size(); ++i) { - ones += bloom[i]; - v[i/8] |= bloom[i] << i % 8; + v[i/8] |= bloom[i] << (i % 8); } - dcdebug("Bloom fill: %u/%u = %lf\n", ones, bloom.size(), static_cast<double>(ones)/bloom.size()); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |