我想创建一个文件的哈希,这样如果文件被更改,我可以确定文件的哪些部分发生了变化。问题是如果删除或添加一个字节,所有后续的哈希值也会改变,因此我需要在每个字节中迭代所有哈希值。然而,这可能是昂贵的,所以我正在寻找一个哈希,它不需要我重新计算整个哈希开始完成,而是让我撤消一个字节,然后添加另一个字节。
伪代码:
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”的任何想法?
答案 0 :(得分:0)
如果您可以使用长度为log2(N)字节的哈希值,则可以使用Hamming code。如果它必须更短,那么Low-density parity-check代码就可以完成这项工作。
答案 1 :(得分:0)
@Interjay的评论是正确的,我需要一个滚动哈希。此外,我在这里描述的算法类似于rsync所做的(和Dropbox的扩展)。