DRY up and document magic constant used for hash maps

This commit is contained in:
Vinnie Falco
2013-06-07 11:35:56 -07:00
parent 3cf2fb884d
commit db9f62646d
3 changed files with 25 additions and 19 deletions

View File

@@ -15,6 +15,28 @@
class HashMaps // : beast::Uncopayble class HashMaps // : beast::Uncopayble
{ {
public: public:
/** Golden ratio constant used in hashing functions.
The magic number is supposed to be 32 random bits, where each is
equally likely to be 0 or 1, and with no simple correlation between
the bits. A common way to find a string of such bits is to use the
binary expansion of an irrational number; in this case, that number
is the reciprocal of the golden ratio:
@code
phi = (1 + sqrt(5)) / 2
2^32 / phi = 0x9e3779b9
@endcode
References:
http://stackoverflow.com/questions/4948780/magic-number-in-boosthash-combine
http://burtleburtle.net/bob/hash/doobs.html
*/
static std::size_t const goldenRatio = 0x9e3779b9;
/** Retrieve the singleton. /** Retrieve the singleton.
@return The global instance of the singleton. @return The global instance of the singleton.

View File

@@ -109,16 +109,8 @@ bool CBase58Data::operator> (const CBase58Data& b58) const { return CompareTo(b5
std::size_t hash_value(const CBase58Data& b58) std::size_t hash_value(const CBase58Data& b58)
{ {
// VFALCO: TODO, figure out what this is for and whether or
// not it affects the protocol specification.
//
// NOTE, this constant is used elsewhere as well.
// should it be DRY?
//
const std::size_t mysteriousConstant = 0x9e3779b9;
std::size_t seed = HashMaps::getInstance ().getNonce <size_t> () std::size_t seed = HashMaps::getInstance ().getNonce <size_t> ()
+ (b58.nVersion * mysteriousConstant); + (b58.nVersion * HashMaps::goldenRatio);
boost::hash_combine (seed, b58.vchData); boost::hash_combine (seed, b58.vchData);

View File

@@ -26,21 +26,13 @@ void SHAMapNode::setMHash() const
{ {
using namespace std; using namespace std;
// VFALCO: TODO, figure out what this is for and whether or
// not it affects the protocol specification.
//
// NOTE, this constant is used elsewhere as well.
// should it be DRY?
//
const std::size_t mysteriousConstant = 0x9e3779b9;
std::size_t h = HashMaps::getInstance ().getNonce <std::size_t> () std::size_t h = HashMaps::getInstance ().getNonce <std::size_t> ()
+ (mDepth * mysteriousConstant); + (mDepth * HashMaps::goldenRatio);
const unsigned int *ptr = reinterpret_cast <const unsigned int *>(mNodeID.begin()); const unsigned int *ptr = reinterpret_cast <const unsigned int *>(mNodeID.begin());
for (int i = (mDepth + 7) / 8; i != 0; --i) for (int i = (mDepth + 7) / 8; i != 0; --i)
h = (h * mysteriousConstant) ^ *ptr++; h = (h * HashMaps::goldenRatio) ^ *ptr++;
mHash = h; mHash = h;
} }