mirror of
https://github.com/XRPLF/rippled.git
synced 2025-11-28 23:15:52 +00:00
Cache the hash of a SHAMapNode.
This commit is contained in:
@@ -21,13 +21,15 @@ DECLARE_INSTANCE(SHAMap);
|
||||
DECLARE_INSTANCE(SHAMapItem);
|
||||
DECLARE_INSTANCE(SHAMapTreeNode);
|
||||
|
||||
void SHAMapNode::setHash() const
|
||||
{
|
||||
std::size_t h = theApp->getNonceST() + mDepth;
|
||||
mHash = mNodeID.hash_combine(h);
|
||||
}
|
||||
|
||||
std::size_t hash_value(const SHAMapNode& mn)
|
||||
{
|
||||
std::size_t seed = theApp->getNonceST();
|
||||
|
||||
boost::hash_combine(seed, mn.getDepth());
|
||||
|
||||
return mn.getNodeID().hash_combine(seed);
|
||||
return mn.getHash();
|
||||
}
|
||||
|
||||
std::size_t hash_value(const uint256& u)
|
||||
|
||||
@@ -27,23 +27,28 @@ class SHAMap;
|
||||
|
||||
|
||||
class SHAMapNode
|
||||
{ // Identifies a node in a SHA256 hash
|
||||
{ // Identifies a node in a SHA256 hash map
|
||||
private:
|
||||
static uint256 smMasks[65]; // AND with hash to get node id
|
||||
|
||||
uint256 mNodeID;
|
||||
int mDepth;
|
||||
int mDepth;
|
||||
mutable size_t mHash;
|
||||
|
||||
void setHash() const;
|
||||
|
||||
public:
|
||||
|
||||
static const int rootDepth = 0;
|
||||
|
||||
SHAMapNode() : mDepth(0) { ; }
|
||||
SHAMapNode() : mDepth(0), mHash(0) { ; }
|
||||
SHAMapNode(int depth, const uint256& hash);
|
||||
virtual ~SHAMapNode() { ; }
|
||||
|
||||
int getDepth() const { return mDepth; }
|
||||
const uint256& getNodeID() const { return mNodeID; }
|
||||
bool isValid() const { return (mDepth >= 0) && (mDepth < 64); }
|
||||
size_t getHash() const { if (mHash == 0) setHash(); return mHash; }
|
||||
|
||||
virtual bool isPopulated() const { return false; }
|
||||
|
||||
|
||||
@@ -102,15 +102,16 @@ uint256 SHAMapNode::getNodeID(int depth, const uint256& hash)
|
||||
return hash & smMasks[depth];
|
||||
}
|
||||
|
||||
SHAMapNode::SHAMapNode(int depth, const uint256 &hash) : mDepth(depth)
|
||||
SHAMapNode::SHAMapNode(int depth, const uint256 &hash) : mDepth(depth), mHash(0)
|
||||
{ // canonicalize the hash to a node ID for this depth
|
||||
assert((depth >= 0) && (depth < 65));
|
||||
mNodeID = getNodeID(depth, hash);
|
||||
}
|
||||
|
||||
SHAMapNode::SHAMapNode(const void *ptr, int len)
|
||||
SHAMapNode::SHAMapNode(const void *ptr, int len) : mHash(0)
|
||||
{
|
||||
if (len < 33) mDepth = -1;
|
||||
if (len < 33)
|
||||
mDepth = -1;
|
||||
else
|
||||
{
|
||||
memcpy(mNodeID.begin(), ptr, 32);
|
||||
|
||||
Reference in New Issue
Block a user