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);
}
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);
}
相关文章推荐
- 090823项目进展:学习emule源码2,文件管理类
- 090828项目进展:学习emule源码4,CAsyncSocketEx
- 090822项目进展:学习emule源码1,
- coreboot学习2:项目源码的初步了解
- 【机器人学】机器人开源项目KDL源码学习:(6)笛卡尔空间轨迹规划、圆弧过渡、姿态插值、梯形速度、pathlength
- JAVA小项目实例源码—学习娱乐小助手
- 专访许鹏:谈C程序员修养及大型项目源码阅读与学习
- 『TensorFlow』SSD源码学习_其一:项目介绍导读
- 【机器人学】机器人开源项目KDL源码学习:(4)机械臂逆动力学的牛顿欧拉算法
- Java项目源码学习笔记(一):IdentityCache
- apache的开源项目-模板引擎(Velocity)_学习了两天就上手啦_源码下载
- BaseRecyclerViewAdapterHelper开源项目之BaseSectionQuickAdapter 实现Expandable And collapse效果的源码学习
- BaseRecyclerViewAdapterHelper开源项目之点击事件源码学习
- 090819项目进展:了解emule基础知识,猜想实现的方向
- 专访许鹏:谈C程序员修养及大型项目源码阅读与学习
- 【Android学习】JSON与XML综合六种解析方式-综合案例(web项目源码+android源码+jar包)
- 【机器人学】机器人开源项目KDL源码学习:(1)下载源码并在ubuntu下运行geometry部分(旋转矩阵)
- 转: 如何快速学习一个开源项目源码?
- spring源码学习之:项目公共配置项解决方案
- MongoDB的使用学习之(七)MongoDB的聚合查询(两种方式)附项目源码