如何通过快速比较哈希来找到插入/删除?

时间:2013-06-14 22:24:57

标签: algorithm hash

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

伪代码:

string getFileDiffHash(file){
    string result = "";
    for each (512 bytes in file){
        result += hash(bytes);
    }
}

string getFileDiff(file, diffHash){
    string result = "";
    for each (hash size bytes in diffHash){ //yes this would be in a hash table ideally, but hey, this is pseudocode
        string current_hash = "";
        for (i = 0; i < file_size(file); i++){
            if (current_hash.size > 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){
                result += "+"+diffHash+":"+i;
            }
        }
    }
    return result;
}

有关什么类型的哈希适合“undo_hash”和“add_hash”的任何想法?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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