【问题标题】:How to find insertions/deletions by comparing hashes quickly?如何通过快速比较哈希来查找插入/删除?
【发布时间】:2013-06-15 07:39:47
【问题描述】:

我想创建一个文件的哈希,这样如果文件被更改,我可以确定文件的哪些部分发生了更改。问题是,如果删除或添加一个字节,所有后续散列也会发生变化,因此我需要通过所有散列遍历每个字节。然而,这可能很昂贵,所以我正在寻找一个不需要我重新计算整个哈希开始到完成而是让我撤消一个字节然后添加另一个字节的哈希。

伪代码:

字符串 getFileDiffHash(file){
    字符串结果 = "";
    对于每个(文件中的 512 个字节){
        结果+=哈希(字节);
    }
}

字符串 getFileDiff(文件,diffHash){
    字符串结果 = "";
    对于每个(diffHash 中的哈希大小字节){ //是的,理想情况下这将在哈希表中,但是嘿,这是伪代码
        字符串 current_hash = "";
        for (i = 0; i  hash_size){
                current_hash = undo_hash(current_hash, file[i-hash_size]);
            }
            current_hash = add_hash(current_hash, file[i]);
            if (current_hash.size == hash_size && bytes == current_hash){
                结果 += "+"+diffHash+":"+i;
            }
        }
    }
    返回结果;
}

您知道哪种哈希适合“undo_hash”和“add_hash”吗?

【问题讨论】:

  • 你能解释一下关闭投票而不是简单地关闭它吗?这是一个相关的编程问题。
  • 请说明您正在努力做得更好。这个问题非常不清楚。添加一些解释并展示示例。
  • 好多了。查找“滚动哈希”,我认为这就是您要查找的内容。
  • 您要跟踪哪些类型的编辑?您是在寻找单个插入/删除,还是插入和删除组?另外,您是否有理由不能使用像 diff 这样的标准工具来执行此操作?
  • @templatetypedef diff 的问题在于它要求你有之前和之后。我只有之后和我选择从之前保留的任何哈希值。我不想保留之前的完整副本,因为它太大了。

标签: algorithm hash


【解决方案1】:

如果您可以拥有长度为 log2(N) 字节的哈希,则可以使用Hamming code。如果它必须更短,那么Low-density parity-check 代码就可以完成这项工作。

【讨论】:

    【解决方案2】:

    @Interjay 的评论是正确的,我需要一个滚动哈希。此外,我在这里描述的算法类似于 rsync 所做的(以及 Dropbox 的扩展)。

    【讨论】:

      猜你喜欢
      • 2015-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多