mirror of
https://github.com/XRPLF/rippled.git
synced 2025-11-27 22:45:52 +00:00
DRY up and document magic constant used for hash maps
This commit is contained in:
@@ -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.
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user