我想编写一个相对简单的程序,它可以将文件从我的计算机备份到远程位置,并在进程中对它们进行加密,同时还计算差异。我很满意地看到本地和远程文件之间是否有任何改变,而不是改变了什么),以查看哪些改变了并且需要更新。检查两个(大)文件之间的差异
我知道有很好的程序可以做到这一点(rsync或其他基于双重性的程序)。我不是要推倒重来,它只是应该是关于该项目的DIFF部分为自己
我的问题是学习经验。我做了一些假设,并写了一些示例代码来测试它们,但是我想知道你是否看到我可能错过的任何内容,如果这些假设是错误的,或者某个特定的错误可能会出错。
假设1:如果文件长度不相等,它们不能是相同的(即一些修改必须已经发生。)
假设2:如果两个文件是相同的(即,没有修改)这两个文件的任何字节子集将具有相同的散列
假设3:如果发现两个文件的字节子集不会导致相同的散列,则这两个文件是不一样(即已被修改)
该代码是用Java编写的哈希alg使用的算法是BLAKE-512,使用Marc Greim的java implementation。
_File1
和_File2
是2个文件>型java.io.File
public boolean compareStream() throws IOException {
int i = 0;
int step = 4096;
boolean equal = false;
FileInputStream fi1 = new FileInputStream(_File1);
FileInputStream fi2 = new FileInputStream(_File2);
byte[] fi1Content = new byte[step];
byte[] fi2Content = new byte[step];
if(_File1.length() == _File2.length()) { //Assumption 1
while(i*step < _File1.length()) {
fi1.read(fi1Content, 0, step); //Assumption 2
fi2.read(fi2Content, 0, step); //Assumption 2
equal = BLAKE512.isEqual(fi1Content, fi2Content); //Assumption 2
if(!equal) { //Assumption 3
break;
}
++i;
}
}
fi1.close();
fi2.close();
return equal;
}
为两个相等的1.5 GB的文件的计算需要大约为420秒1.5GB。当文件不同时,时间当然要短得多,尤其是当它们的长度不同时,它会立即返回。
谢谢您的建议:)
..我希望这不是太宽泛
不是太宽...这是一个很好的问题,但是是offtopic ...检查http://codereview.stackexchange.com/ –
啊好主意!我没有意识到这一点..谢谢! –
你还没有真正提出过问题。 – RealSkeptic