【发布时间】:2015-05-08 21:18:53
【问题描述】:
我想编写一个相对简单的程序,它可以将文件从我的计算机备份到远程位置并在此过程中加密它们,同时还计算差异(当然不是真的......我很满足于看看有没有在本地和远程文件之间完全改变,而不是改变了什么),以查看哪些已更改并且需要更新。
我知道有非常好的程序可以做到这一点(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 秒。当文件不同时,时间当然要短得多,尤其是当它们的长度不同时,因为它会立即返回。
感谢您的建议 :)
..我希望这不是太宽泛
【问题讨论】:
-
不是太宽泛...这是个好问题,但题外话...检查codereview.stackexchange.com
-
啊,好主意!我不知道..谢谢!
-
你实际上并没有提出问题。
-
嗯,是的..问题是:我的假设错了吗?,你看到我可能错过的任何东西吗?你有没有发现在某些情况下可能会出现可怕的错误? ...但正如 Jordi 建议的那样,这可能更适合 codereview
-
我已经在 codereview 上发布了这个问题:codereview.stackexchange.com/questions/90147/…。标记为因离题而关闭