mirror of
https://github.com/XRPLF/rippled.git
synced 2025-11-28 15:05:53 +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
|
||||
{
|
||||
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.
|
||||
|
||||
@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)
|
||||
{
|
||||
// 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> ()
|
||||
+ (b58.nVersion * mysteriousConstant);
|
||||
+ (b58.nVersion * HashMaps::goldenRatio);
|
||||
|
||||
boost::hash_combine (seed, b58.vchData);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user