我想编写一个相对简单的程序,它可以将文件从我的计算机备份到远程位置并在此过程中对它们进行加密,同时还计算差异(实际上并非如此......我满足于查看是否有任何内容在本地文件和远程文件之间发生了变化,而不是发生了什么变化,以查看哪些变更并且需要更新。
我知道有很好的程序可以做到这一点(rsync,或其他基于双重性的程序)。我不是要重新发明轮子,它应该是我自己的学习经历
我的问题是关于项目的 diff 部分。我已经做了一些假设并编写了一些示例代码来测试它们,但是我想知道你是否看到了我可能错过的任何内容,假设这些假设是完全错误的,或者是否有某些东西可能在特定的遗嘱中出错
假设1:如果文件的长度不相等,则它们不能相同(即必须进行一些修改)
假设2:如果两个文件相同(即没有进行任何修改),这两个文件的任何字节子集将具有相同的散列
假设3:如果找到两个文件的字节子集,但不会产生相同的散列,则这两个文件不相同(即已被修改)
代码是用Java编写的,使用的哈希算法是BLAKE-512,使用Marc Greim的java implementation。
_File1
和_File2
是2个文件> 1.5GB类型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文件的计算大约需要4.2秒。当文件不同时,时间当然要短得多,特别是当它们的长度不同时,因为它会立即返回。
感谢您的建议:)
..我希望这不是太宽泛
答案 0 :(得分:1)
虽然假设是正确的,但它们不会防止罕见的误报(当方法说文件相同时,他们不是):
假设2:如果两个文件相同(即没有进行任何修改),任何字节子集将具有相同的散列
这是正确的,但是由于哈希冲突你可以得到这种情况,当块的哈希值相同时,但块本身就不同了。