我想編寫一個相對簡單的程序,它可以將文件從我的計算機備份到遠程位置,並在進程中對它們進行加密,同時還計算差異。我很滿意地看到本地和遠程文件之間是否有任何改變,而不是改變了什麼),以查看哪些改變了並且需要更新。檢查兩個(大)文件之間的差異
我知道有很好的程序可以做到這一點(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