예제 #1
0
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;
}
예제 #2
0
/**
 * 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;
}