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

 

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

 

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值