您的位置:首页 > 大数据 > 人工智能

090824项目进展:学习emule源码3,CAICHHashTree

2009-08-24 19:00 330 查看
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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐