/** * Generate the checksums for a block and write it out. Called when * we already know we have enough data in memory at \p block. */ static rs_result rs_sig_do_block(rs_job_t *job, const void *block, size_t len) { unsigned int weak_sum; rs_strong_sum_t strong_sum; weak_sum = rs_calc_weak_sum(block, len); //rs_calc_strong_sum(block, len, &strong_sum); rs_squirt_n4(job, weak_sum); rs_tube_write(job, strong_sum, job->strong_sum_len); /* if (rs_trace_enabled()) { char strong_sum_hex[RS_MD4_LENGTH * 2 + 1]; rs_hexify(strong_sum_hex, strong_sum, job->strong_sum_len); rs_trace("sent weak sum 0x%08x and strong sum %s", weak_sum, strong_sum_hex); } */ job->stats.sig_blocks++; return RS_RUNNING; }
vector< BlockChecksum> getBlockChecksum(vector<Chunk> unmatchedChunks, string filepath){ cout<<"Calculating weak and strong checksums of the blocks...\n"; vector < BlockChecksum> blockChecksums; int blockSize=ConfigurationManager::getBlockSize(); ifstream in_file(filepath.c_str(),std::ifstream::binary); int blockcount=0; for(int i=0; i<unmatchedChunks.size();i++){ in_file.seekg(unmatchedChunks[i].getOffset(),in_file.beg); int k=0; char data[blockSize]; for(k=0;k+blockSize<unmatchedChunks[i].getLength();k+=blockSize){ in_file.read(data,blockSize); unsigned int weaksum=rs_calc_weak_sum(&data,blockSize); BlockChecksum block(weaksum,unmatchedChunks[i].getOffset()+k,blockSize); rs_calc_strong_sum(&data,blockSize,&block.strongsum); blockcount++; blockChecksums.push_back(block); } int kl=unmatchedChunks[i].getLength(); int kb=k-blockSize; if(kl>kb){ int remainingRBlength=unmatchedChunks[i].getLength()-k; in_file.read(data,remainingRBlength); char extradata[remainingRBlength]; unsigned int weaksum=rs_calc_weak_sum(&extradata,blockSize); BlockChecksum block(weaksum,unmatchedChunks[i].getOffset()+k,remainingRBlength); rs_calc_strong_sum(&data,blockSize,&block.strongsum); blockcount++; blockChecksums.push_back(block); } } in_file.close(); return blockChecksums; }