好揪心啊,有没有大神出手相助一把吗,帮帮找找问题。
metric_PAS_64.zip
(224.03 KB)
附上Java代码
package cn.edu.cust.deduple;
import
import
import
import
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import cn.edu.cust.deduple.utils.Checksum;
import cn.edu.cust.deduple.utils.MapUtils;
import cn.edu.cust.deduple.utils.Md5Util;
///**
// * @ClassName: CDC
// * @Description:
// * @author: 王大鸟
// * @date: 2016/5/18
// */
public class CDC {
// /**
// * rabin指纹之除数
// */
// private static final int D = 5;
// /**
// * rabin指纹之商
// */
// private static final int F = 3;
// /**
// * 最大值
// */
// private static final int MAX = 8 * 1024;
// /**
// * 最小值
// */
// private static final int MIN = 4 * 1024;
// /**
// * 滑动窗口大小
// */
// private static final int WINLEN = 4 * 1024;
private static Map<String, Long> fingerPrints = new HashMap<String, Long>();
static final int BUF_MAX_SZ = 128 * 1024;
static final int BLOCK_MAX_SZ = 4096;
static final int BLOCK_WIN_SZ = 32;
static final int BLOCK_MIN_SZ = 64;
static final int BLOCK_SZ = 4096;
static final int CHUNK_CDC_R = 13;
FileChunks fileChunk(File f) throws IOException {
byte buf[] = new byte[BUF_MAX_SZ];
byte block_buf[] = new byte[BLOCK_MAX_SZ + BLOCK_WIN_SZ];
byte win_buf[] = new byte[BLOCK_WIN_SZ + 1];
byte adler_pre_char = 0;
//unsigned char md5_checksum[16 + 1] = {0};
//unsigned char csum[10 + 1] = {0};
int bpos = 0;
int rwsize = 0;
int exp_rwsize = BUF_MAX_SZ;
int head, tail;
int block_sz = 0, old_block_sz = 0;
long hkey = 0;
//chunk_block_entry chunk_bentry;
long offset = 0;
FileInputStream fin = new FileInputStream(f);
FileChannel fc = fin.getChannel();
ByteBuffer bb = ByteBuffer.wrap(buf, bpos, exp_rwsize);
FileChunks fcs = new FileChunks();
while((rwsize = fc.read(bb)) >= 0) {
/* last chunk */
System.out.println("rwsize:" + rwsize);
if ((rwsize + bpos + block_sz) < BLOCK_MIN_SZ)
break;
head = 0;
tail = bpos + rwsize;
/* avoid unnecessary computation and comparsion */
if (block_sz < (BLOCK_MIN_SZ - BLOCK_WIN_SZ)) {
old_block_sz = block_sz;
block_sz = ((block_sz + tail - head) > (BLOCK_MIN_SZ - BLOCK_WIN_SZ)) ?
BLOCK_MIN_SZ - BLOCK_WIN_SZ : block_sz + tail -head;
System.arraycopy(buf, head, block_buf, old_block_sz, block_sz - old_block_sz);
//memcpy(block_buf + old_block_sz, buf + head, block_sz - old_block_sz);
head += (block_sz - old_block_sz);
}
while ((head + BLOCK_WIN_SZ) <= tail) {
System.arraycopy(buf, head, win_buf, 0, BLOCK_WIN_SZ);
//memcpy(win_buf, buf + head, BLOCK_WIN_SZ);
hkey = (block_sz == (BLOCK_MIN_SZ - BLOCK_WIN_SZ)) ? Checksum.adler32_checksum(win_buf, BLOCK_WIN_SZ) :
Checksum.adler32_rolling_checksum((int)hkey, BLOCK_WIN_SZ, adler_pre_char, buf[head+BLOCK_WIN_SZ-1]);
//System.out.println("hkey:" + (hkey % BLOCK_SZ));
/* get a normal chunk, write block info to chunk file */
if ((hkey % BLOCK_SZ) == CHUNK_CDC_R) {
//System.out.println(block_sz + BLOCK_WIN_SZ);
System.arraycopy(buf, head, block_buf, block_sz, BLOCK_WIN_SZ);
//memcpy(block_buf + block_sz, buf + head, BLOCK_WIN_SZ);
head += BLOCK_WIN_SZ;
block_sz += BLOCK_WIN_SZ;
if(block_sz > BLOCK_MAX_SZ){
System.out.println(">4096:" + block_sz);
}
if (block_sz >= BLOCK_MIN_SZ) {
fcs.addChunk(offset, block_sz, block_buf);
/*md5(block_buf, block_sz, md5_checksum);
uint_2_str(adler32_checksum(block_buf, block_sz), csum);
chunk_file_hdr->block_nr++;
chunk_bentry.len = block_sz;
chunk_bentry.offset = offset;
memcpy(chunk_bentry.md5, md5_checksum, 16 + 1);
memcpy(chunk_bentry.csum, csum, 10 + 1);
rwsize = write(fd_chunk, &chunk_bentry, CHUNK_BLOCK_ENTRY_SZ);
if (rwsize == -1 || rwsize != CHUNK_BLOCK_ENTRY_SZ)
return -1;*/
offset += block_sz;
block_sz = 0;
}
} else {
block_buf[block_sz++] = buf[head++];
/* get an abnormal chunk, write block info to chunk file */
if (block_sz >= BLOCK_MAX_SZ) {
fcs.addChunk(offset, block_sz, block_buf);
/*md5(block_buf, block_sz, md5_checksum);
uint_2_str(adler32_checksum(block_buf, block_sz), csum);
chunk_file_hdr->block_nr++;
chunk_bentry.len = block_sz;
chunk_bentry.offset = offset;
memcpy(chunk_bentry.md5, md5_checksum, 16+1);
memcpy(chunk_bentry.csum, csum, 10 + 1);
rwsize = write(fd_chunk, &chunk_bentry, CHUNK_BLOCK_ENTRY_SZ);
if (rwsize == -1 || rwsize != CHUNK_BLOCK_ENTRY_SZ)
return -1;*/
offset += block_sz;
block_sz = 0;
}
}
/* avoid unnecessary computation and comparsion */
if (block_sz == 0) {
block_sz = ((tail - head) > (BLOCK_MIN_SZ - BLOCK_WIN_SZ)) ?
BLOCK_MIN_SZ - BLOCK_WIN_SZ : tail - head;
System.arraycopy(buf, head, block_buf, 0, block_sz);
//memcpy(block_buf, buf + head, block_sz);
head = ((tail - head) > (BLOCK_MIN_SZ - BLOCK_WIN_SZ)) ?
head + (BLOCK_MIN_SZ - BLOCK_WIN_SZ) : tail;
}
adler_pre_char = buf[head - 1];
}
/* read expected data from file to full up buf */
bpos = tail - head;
exp_rwsize = BUF_MAX_SZ - bpos;
adler_pre_char = buf[head - 1];
System.arraycopy(buf, head, buf, 0, bpos);
//memmove(buf, buf + head, bpos);
bb = ByteBuffer.wrap(buf, bpos, exp_rwsize);
}
fin.close();
return fcs;
/*if (rwsize == -1)
return -1;
return 0;*/
}
// /**
// * CDC算法实现
// *
// * @param file
// * @throws IOException
// * @throws NoSuchAlgorithmException
// */
// public void process(File file) throws IOException, NoSuchAlgorithmException {
// byte[] win_buf = new byte[WINLEN];
// long win_tail = 0;
// String fingerPrint = null;
// byte[] buf = new byte[MAX];
// RandomAccessFile randomAccessFile = new RandomAccessFile(file, "r");
// long fileLength = randomAccessFile.length();
//
// while (randomAccessFile.read(win_buf) > 0) {
// long filePointer = randomAccessFile.getFilePointer();
// //如果大于最大值
// if (filePointer - win_tail > MAX) {
// randomAccessFile.seek(win_tail);
// randomAccessFile.read(buf);
// fingerPrint = Md5Util.getMD5(buf);
// MapUtils.judgeKey(fingerPrints, fingerPrint);
// win_tail = filePointer;
// continue;
// }
// //满足rabin指纹
// if ((Arrays.hashCode(win_buf) % D == F) && !((filePointer - win_tail) < MIN)) {
// offset(randomAccessFile, filePointer, win_tail);
// win_tail = filePointer;
// } else if (filePointer == fileLength) {
// offset(randomAccessFile, filePointer, win_tail);
// break;
// } else {
// randomAccessFile.seek(filePointer - (4 * 1024) + 1);
// }
// }
// }
//
// /**
// * 重复代码封装
// *
// * @param randomAccessFile
// * @param filePointer
// * @param win_tail
// * @throws IOException
// * @throws NoSuchAlgorithmException
// */
// public void offset(RandomAccessFile randomAccessFile, long filePointer, long win_tail) throws IOException, NoSuchAlgorithmException {
// byte[] tmpbytes = new byte[Integer.parseInt(String.valueOf(filePointer - win_tail))];
// randomAccessFile.seek(win_tail);
// randomAccessFile.read(tmpbytes);
// String fingerPrint = Md5Util.getMD5(tmpbytes);
// MapUtils.judgeKey(fingerPrints, fingerPrint);
// }
//
// public static void main(String[] args) {
// try{
// CDC cdc = new CDC();
// FileChunks fcs = cdc.fileChunk(new File("/home/qh/下载/SPAS data set/2.txt"));
// //fcs.printChunks();
// }catch(IOException ex){
// ex.printStackTrace();
// }
// }
}