2015-05-08 44 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:如果两个文件是相同的(即无修改发生)任何字节子集将具有相同的哈希

这是正确的,但由于哈希碰撞,你可以有情况,当大块的哈希是相同的,但大块本身不同。