Cache the hash of a SHAMapNode.

This commit is contained in:
JoelKatz
2013-01-12 03:05:45 -08:00
parent be93d59933
commit 57313a9339
3 changed files with 19 additions and 11 deletions

View File

@@ -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)

View File

@@ -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; }

View File

@@ -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);