【问题标题】:Check for differences between two (large) files检查两个(大)文件之间的差异
【发布时间】: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/…。标记为因离题而关闭

标签: java hash backup diff


【解决方案1】:

虽然假设是正确的,但它们无法防止出现罕见的误报(当方法表明文件不相等时):

假设 2:如果两个文件相同(即没有发生任何修改),任何字节子集都将具有相同的哈希

这是对的,但是由于哈希冲突,您可能会遇到这样的情况,即块的哈希相同,但块本身不同。

【讨论】:

    猜你喜欢
    • 2014-02-02
    • 1970-01-01
    • 2011-04-02
    • 2014-06-12
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多