2015-05-08 56 views
2

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

我知道有很好的程序可以做到這一點(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。當文件不同時,時間當然要短得多,尤其是當它們的長度不同時,它會立即返回。

謝謝您的建議:)
..我希望這不是太寬泛

+0

不是太寬...這是一個很好的問題,但是是offtopic ...檢查http://codereview.stackexchange.com/ –

+1

啊好主意!我沒有意識到這一點..謝謝! –

+0

你還沒有真正提出過問題。 – RealSkeptic

回答

1

雖然假設是正確的,他們不會從罕見的誤報保護(方法時說文件是相等的,當他們都沒有):

假設2:如果兩個文件是相同的(即無修改發生)任何字節子集將具有相同的哈希

這是正確的,但由於哈希碰撞,你可以有情況,當大塊的哈希是相同的,但大塊本身不同。