1,依据文件块的位置和单元块的大小PARTSIZE查找hashTree。
FindHash是被重载的:
public:
CAICHHashTree* FindHash(uint64 nStartPos, uint64 nSize)
{uint8 buffer = 0;
return FindHash(nStartPos, nSize, &buffer);}
和:
protected:
CAICHHashTree* FindHash(uint64 nStartPos, uint64 nSize, uint8* nLevel);
KnownFile.cpp中当然只能调用那个public的了:
CreateFromFile函数中,使用循环,获取各位置的HashTree:
for (hashcount = 0; togo >= PARTSIZE; )
{
CAICHHashTree* pBlockAICHHashTree = m_pAICHHashSet->m_pHashTree.FindHash((uint64)hashcount*PARTSIZE, PARTSIZE);
ASSERT( pBlockAICHHashTree != NULL ); ......
}
public的FindHash是需要调用protected的FindHash才能实现功能的:
CAICHHashTree* CAICHHashTree::FindHash(uint64 nStartPos, uint64 nSize, uint8* nLevel){
停止条件是:
if (nStartPos == 0 && nSize == m_nDataSize){
// this is the searched hash
return this;
否则:部署并递归recursive
if (nStartPos < nLeft){
if (nStartPos + nSize > nLeft){ // sanity
ASSERT ( false );
return NULL;
}
if (m_pLeftTree == NULL)
{//
m_pLeftTree = new CAICHHashTree(nLeft, true, (nLeft <= PARTSIZE) ? EMBLOCKSIZE : PARTSIZE);
}
else{
ASSERT( m_pLeftTree->m_nDataSize == nLeft );
}
return m_pLeftTree->FindHash(nStartPos, nSize, nLevel);
}
else{
nStartPos -= nLeft;
if (nStartPos + nSize > nRight){ // sanity
ASSERT ( false );
return NULL;
}
if (m_pRightTree == NULL)
m_pRightTree = new CAICHHashTree(nRight, false, (nRight <= PARTSIZE) ? EMBLOCKSIZE : PARTSIZE);
else{
ASSERT( m_pRightTree->m_nDataSize == nRight );
}
return m_pRightTree->FindHash(nStartPos, nSize, nLevel);
}