亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? shahashset.cpp

?? Pipe類 Pipe類 Pipe類 Pipe類 Pipe類
?? CPP
字號:
//this file is part of eMule
//Copyright (C)2002-2006 Merkur ( strEmail.Format("%s@%s", "devteam", "emule-project.net") / http://www.emule-project.net )
//
//This program is free software; you can redistribute it and/or
//modify it under the terms of the GNU General Public License
//as published by the Free Software Foundation; either
//version 2 of the License, or (at your option) any later version.
//
//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	See the
//GNU General Public License for more details.
//
//You should have received a copy of the GNU General Public License
//along with this program; if not, write to the Free Software
//Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

#include "StdAfx.h"
#include "shahashset.h"
#include "sha.h"
#include "FileHasher.h"
#include "functions.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


// for this version the limits are set very high, they might be lowered later
// to make a hash trustworthy, at least 10 unique Ips (255.255.128.0) must have send it
// and if we have received more than one hash  for the file, one hash has to be send by more than 95% of all unique IPs
#define MINUNIQUEIPS_TOTRUST		10	// how many unique IPs most have send us a hash to make it trustworthy
#define	MINPERCENTAGE_TOTRUST		92  // how many percentage of clients most have sent the same hash to make it trustworthy


/////////////////////////////////////////////////////////////////////////////////////////
///CAICHHash
CString CAICHHash::GetString() const{
	return EncodeBase32(m_abyBuffer, HASHSIZE);
}

/////////////////////////////////////////////////////////////////////////////////////////
///CAICHHashTree

CAICHHashTree::CAICHHashTree(uint64 nDataSize, bool bLeftBranch, uint64 nBaseSize){
	m_nDataSize = nDataSize;
	m_nBaseSize = nBaseSize;
	m_bIsLeftBranch = bLeftBranch;
	m_pLeftTree = NULL;
	m_pRightTree = NULL;
	m_bHashValid = false;
}

CAICHHashTree::~CAICHHashTree(){
	delete m_pLeftTree;
	delete m_pRightTree;
}

// recursive
CAICHHashTree* CAICHHashTree::FindHash(uint64 nStartPos, uint64 nSize, uint8* nLevel){
	(*nLevel)++;
	if (*nLevel > 22){ // sanity
		ASSERT( false );
		return false;
	}
	if (nStartPos + nSize > m_nDataSize){ // sanity
		ASSERT ( false );
		return NULL;
	}
	if (nSize > m_nDataSize){ // sanity
		ASSERT ( false );
		return NULL;
	}

	if (nStartPos == 0 && nSize == m_nDataSize){
		// this is the searched hash
		return this;
	}
	else if (m_nDataSize <= m_nBaseSize){ // sanity
		// this is already the last level, cant go deeper
		ASSERT( false );
		return NULL;
	}
	else{
		uint64 nBlocks = m_nDataSize / m_nBaseSize + ((m_nDataSize % m_nBaseSize != 0 )? 1:0); 
		uint64 nLeft = ( ((m_bIsLeftBranch) ? nBlocks+1:nBlocks) / 2)* m_nBaseSize;
		uint64 nRight = m_nDataSize - nLeft;
		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);
		}
	}
}

// recursive
// calculates missing hash fromt he existing ones
// overwrites existing hashs
// fails if no hash is found for any branch
bool CAICHHashTree::ReCalculateHash(CAICHHashAlgo* hashalg, bool bDontReplace){
	ASSERT ( !( (m_pLeftTree != NULL) ^ (m_pRightTree != NULL)) ); 
	if (m_pLeftTree && m_pRightTree){
		if ( !m_pLeftTree->ReCalculateHash(hashalg, bDontReplace) || !m_pRightTree->ReCalculateHash(hashalg, bDontReplace) )
			return false;
		if (bDontReplace && m_bHashValid)
			return true;
		if (m_pRightTree->m_bHashValid && m_pLeftTree->m_bHashValid){
			hashalg->Reset();
			hashalg->Add(m_pLeftTree->m_Hash.GetRawHash(), HASHSIZE);
			hashalg->Add(m_pRightTree->m_Hash.GetRawHash(), HASHSIZE);
			hashalg->Finish(m_Hash);
			m_bHashValid = true;
			return true;
		}
		else
			return m_bHashValid;
	}
	else
		return true;
}

bool CAICHHashTree::VerifyHashTree(CAICHHashAlgo* hashalg, bool bDeleteBadTrees){
	if (!m_bHashValid){
		ASSERT ( false );
		if (bDeleteBadTrees){
			delete m_pLeftTree;
			m_pLeftTree = NULL;
			delete m_pRightTree;
			m_pRightTree = NULL;
		}
		return false;
	}
	
		// calculated missing hashs without overwriting anything
		if (m_pLeftTree && !m_pLeftTree->m_bHashValid)
			m_pLeftTree->ReCalculateHash(hashalg, true);
		if (m_pRightTree && !m_pRightTree->m_bHashValid)
			m_pRightTree->ReCalculateHash(hashalg, true);
		
		if ((m_pRightTree && m_pRightTree->m_bHashValid) ^ (m_pLeftTree && m_pLeftTree->m_bHashValid)){
			// one branch can never be verified
			if (bDeleteBadTrees){
				delete m_pLeftTree;
				m_pLeftTree = NULL;
				delete m_pRightTree;
				m_pRightTree = NULL;
			}
			return false;
		}
	if ((m_pRightTree && m_pRightTree->m_bHashValid) && (m_pLeftTree && m_pLeftTree->m_bHashValid)){			
	    // check verify the hashs of both child nodes against my hash 
	
		CAICHHash CmpHash;
		hashalg->Reset();
		hashalg->Add(m_pLeftTree->m_Hash.GetRawHash(), HASHSIZE);
		hashalg->Add(m_pRightTree->m_Hash.GetRawHash(), HASHSIZE);
		hashalg->Finish(CmpHash);
		
		if (m_Hash != CmpHash){
			if (bDeleteBadTrees){
				delete m_pLeftTree;
				m_pLeftTree = NULL;
				delete m_pRightTree;
				m_pRightTree = NULL;
			}
			return false;
		}
		return m_pLeftTree->VerifyHashTree(hashalg, bDeleteBadTrees) && m_pRightTree->VerifyHashTree(hashalg, bDeleteBadTrees);
	}
	else
		// last hash in branch - nothing below to verify
		return true;

}

void CAICHHashTree::SetBlockHash(uint64 nSize, uint64 nStartPos, CAICHHashAlgo* pHashAlg){
	ASSERT ( nSize <= EMBLOCKSIZE );
	CAICHHashTree* pToInsert = FindHash(nStartPos, nSize);
	if (pToInsert == NULL){ // sanity
		ASSERT ( false );
		return;
	}
	
	//sanity
	if (pToInsert->m_nBaseSize != EMBLOCKSIZE || pToInsert->m_nDataSize != nSize){
		ASSERT ( false );
		return;
	}

	pHashAlg->Finish(pToInsert->m_Hash);
	pToInsert->m_bHashValid = true;
	//DEBUG_ONLY(theApp.QueueDebugLogLine(/*DLP_VERYLOW,*/ false, _T("Set ShaHash for block %u - %u (%u Bytes) to %s"), nStartPos, nStartPos + nSize, nSize, pToInsert->m_Hash.GetString()) );
	
}


/////////////////////////////////////////////////////////////////////////////////////////
///CAICHHashSet
CAICHHashSet::CAICHHashSet(CKnownFile* pOwner)
	: m_pHashTree(0, true, PARTSIZE)
{
	m_eStatus = AICH_EMPTY;
	m_pOwner = pOwner;
}

CAICHHashSet::~CAICHHashSet(void)
{
	FreeHashSet();
}

// delete the hashset except the masterhash (we dont keep aich hashsets in memory to save ressources)
void CAICHHashSet::FreeHashSet(){
	delete m_pHashTree.m_pLeftTree;
	m_pHashTree.m_pLeftTree = NULL;
	delete m_pHashTree.m_pRightTree;
	m_pHashTree.m_pRightTree = NULL;
}

void CAICHHashSet::SetMasterHash(const CAICHHash& Hash, EAICHStatus eNewStatus){
	m_pHashTree.m_Hash = Hash;
	m_pHashTree.m_bHashValid = true;
	SetStatus(eNewStatus);
}

CAICHHashAlgo*	CAICHHashSet::GetNewHashAlgo(){
	return new CSHA();
}

bool CAICHHashSet::ReCalculateHash(bool bDontReplace){
	CAICHHashAlgo* hashalg = GetNewHashAlgo();
	bool bResult = m_pHashTree.ReCalculateHash(hashalg, bDontReplace);
	delete hashalg;
	return bResult;
}

bool CAICHHashSet::VerifyHashTree(bool bDeleteBadTrees){
	CAICHHashAlgo* hashalg = GetNewHashAlgo();
	bool bResult = m_pHashTree.VerifyHashTree(hashalg, bDeleteBadTrees);
	delete hashalg;
	return bResult;
}

void CAICHHashSet::SetFileSize(EMFileSize nSize){
	m_pHashTree.m_nDataSize = nSize;
	m_pHashTree.m_nBaseSize = (nSize <= (uint64)PARTSIZE) ? EMBLOCKSIZE : PARTSIZE;	
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩精品电影| 国产一区视频网站| 欧美亚洲另类激情小说| 亚洲一区免费在线观看| 色偷偷一区二区三区| 一区二区不卡在线播放| 欧美日韩亚洲不卡| 日本 国产 欧美色综合| 日韩免费高清视频| 国产福利精品导航| 亚洲男同1069视频| 日韩一级精品视频在线观看| 久久99国产精品久久99| 中文无字幕一区二区三区| 成人ar影院免费观看视频| 亚洲男女一区二区三区| 欧美日韩性生活| 国产自产2019最新不卡| 亚洲乱码国产乱码精品精可以看 | 五月婷婷久久丁香| 欧美精品一二三四| 国产成人精品aa毛片| 亚洲一区视频在线| 国产喂奶挤奶一区二区三区| 91九色02白丝porn| 国产在线麻豆精品观看| 国产精品成人免费精品自在线观看| 欧美日韩一区二区三区视频 | 国产亚洲一区二区三区四区 | 欧美疯狂做受xxxx富婆| 国产精品一卡二卡| 亚洲成人精品一区| 国产亚洲欧美日韩俺去了| 欧美日韩一级黄| 丁香网亚洲国际| 日韩极品在线观看| 国产精品毛片大码女人| 日韩午夜激情av| 色偷偷久久一区二区三区| 精品一区二区久久| 亚洲国产婷婷综合在线精品| 久久麻豆一区二区| 欧美三级视频在线| 粉嫩欧美一区二区三区高清影视| 午夜精品久久久久久久蜜桃app| 欧美国产日韩一二三区| 欧美一区二区性放荡片| 91福利在线观看| 国产91在线看| 久久99国产精品久久99果冻传媒| 性感美女久久精品| 亚洲人成在线播放网站岛国| 国产丝袜在线精品| 日韩精品一区二区三区蜜臀| 欧美日韩激情一区| 日本精品视频一区二区三区| 成人免费毛片aaaaa**| 久久99在线观看| 奇米影视一区二区三区| 亚洲国产美国国产综合一区二区| 亚洲精品国产精华液| 亚洲欧洲国产日韩| 亚洲国产精品黑人久久久| 精品国产91乱码一区二区三区| 欧美一区二区三区小说| 欧美色图片你懂的| 91浏览器打开| 色94色欧美sute亚洲线路一ni| 粉嫩一区二区三区性色av| 国产不卡视频在线播放| 国产精品88av| 国产成人午夜精品影院观看视频| 国产精品一区在线| 国产在线麻豆精品观看| 韩国精品主播一区二区在线观看| 麻豆免费精品视频| 麻豆91在线观看| 久久99久久99| 国产一区二三区| 国产成人免费视频一区| 福利电影一区二区三区| bt欧美亚洲午夜电影天堂| 99在线热播精品免费| 一本色道a无线码一区v| 欧亚一区二区三区| 国产99精品国产| 一区二区三区四区国产精品| 亚洲女同女同女同女同女同69| 亚洲美腿欧美偷拍| 亚洲国产精品嫩草影院| 日本女优在线视频一区二区| 国内精品久久久久影院薰衣草 | 免费不卡在线视频| 精品亚洲porn| 成人午夜视频在线| 91亚洲永久精品| 欧美日韩免费视频| 精品乱人伦一区二区三区| 久久免费精品国产久精品久久久久| 国产亚洲成av人在线观看导航 | 91精品国产综合久久福利软件| 欧美zozozo| 亚洲视频一区二区在线| 亚洲午夜在线视频| 国内欧美视频一区二区| 色综合 综合色| 日韩午夜激情av| 国产精品网站一区| 亚洲无人区一区| 国产成人欧美日韩在线电影| 色嗨嗨av一区二区三区| 日韩欧美黄色影院| ...xxx性欧美| 免费观看日韩av| 色综合久久88色综合天天6| 日韩三级免费观看| 中文字幕在线播放不卡一区| 日日欢夜夜爽一区| av高清久久久| 欧美一级片在线观看| 国产精品久久久久久久久久免费看| 亚洲一区二区三区四区的| 国内外成人在线| 欧美日韩另类一区| 欧美国产一区二区在线观看| 日本中文字幕一区二区有限公司| av网站免费线看精品| 精品少妇一区二区三区在线播放| 亚洲色图制服诱惑 | 捆绑调教美女网站视频一区| 成人黄色777网| 欧美tickling网站挠脚心| 亚洲午夜免费电影| 成人一级片网址| 日韩精品一区二区在线观看| 亚洲人成精品久久久久久| 极品少妇xxxx精品少妇| 欧美色视频在线观看| 中文字幕五月欧美| 国产成人精品在线看| 欧美精品1区2区| 一区二区不卡在线播放 | 波多野结衣在线aⅴ中文字幕不卡| 制服丝袜日韩国产| 亚洲综合免费观看高清完整版在线 | 亚洲三级电影网站| 六月婷婷色综合| 欧美三级蜜桃2在线观看| 欧美韩国日本综合| 国产一区在线观看视频| 日韩欧美三级在线| 奇米精品一区二区三区在线观看| 在线日韩一区二区| 亚洲男人的天堂在线aⅴ视频| 高潮精品一区videoshd| 久久久久久久久久久电影| 激情综合色播五月| 欧美成人a∨高清免费观看| 午夜久久电影网| 欧美日韩国产美| 亚洲第一狼人社区| 91黄色激情网站| 亚洲另类在线一区| 91污片在线观看| 亚洲蜜臀av乱码久久精品蜜桃| 99久久久国产精品免费蜜臀| 中文字幕精品一区| av综合在线播放| 国产精品不卡在线| 色综合天天综合| 亚洲精品福利视频网站| 色老头久久综合| 图片区日韩欧美亚洲| 91精品国产综合久久香蕉的特点| 日本成人中文字幕在线视频 | 欧美三级视频在线| 午夜视频一区在线观看| 日韩一区二区三区四区五区六区| 久久精品国产一区二区三| 欧美va亚洲va国产综合| 国产成人免费视| 自拍偷拍国产亚洲| 欧美综合在线视频| 琪琪久久久久日韩精品| 久久久精品影视| aaa欧美日韩| 一区二区三区不卡视频在线观看| 欧美日韩mp4| 麻豆成人久久精品二区三区红| 精品久久久久久久久久久院品网| 国产成a人无v码亚洲福利| 亚洲日本在线天堂| 欧美精品第1页| 国产精品一区久久久久| 亚洲免费视频中文字幕| 91麻豆精品国产| 国产成人在线视频网站| 亚洲一区二区三区小说| 精品国产a毛片| 色国产综合视频|