如何在不存储两个版本的情况下检查已更改的数据量

时间:2014-09-29 09:26:03

标签: algorithm diff checksum

我想检查(文本)文件中有多少数据在两次运行生成文件的批处理作业之间发生了变化。由于文件变得非常大,我想避免存储旧文件并使用新文件创建差异。我不太关心改变的确切字节数,百分比就足够了。文件大小可能因运行而异。是否有算法可以做到这一点?

2 个答案:

答案 0 :(得分:1)

虽然它看起来不是一个完整的想法,但它可能会指向更好的想法。

将初始文件分成块。计算每个块的哈希值。存放这些哈希值。

对于新文件,使用相同的块大小,但以不同(自适应)方式将其拆分为块。从第一行开始的块开始。如果它是已知的哈希存储它并将block_size行向下移动。如果不是 - 请不要存储哈希并向下移动1行。

处理完整个新文件后,可以在两个哈希序列上尝试diff算法。

这将粗略显示已更改/删除的内容量。对于添加的内容,您可能需要在第二个序列中插入一些附加内容。

答案 1 :(得分:1)

我不知道这样做的通用算法。但鉴于你的限制,我认为它很简单。

计算CSV中每一行的32位哈希值,并将它们存储在已排序的数组中。然后你比较哈希。如果10%的哈希值已更改,则可能有10%的文件已更改。 (占线数的百分比)

如果这个太大,则计算每个csv行的32位散列,但将每个散列的最后8位存储在直方图中。例如。如果您有10个哈希值,其中最后一个字节为0,则hist [0] = 10.然后,您可以大致计算已更改的行数。

这个结构非常小 - 就像256个32位数字一样。 (约1k)

这并不完美,因为当一行更改时它会移动到另一个存储桶,但该存储桶中的某些行也可能会出现,屏蔽进入的存储区。这是哈希冲突的问题。当您存储更多位时,数据结构会变得更大,但更准确,因为散列冲突会更少。

您可以通过增加直方图中使用的哈希位数来增加或减少哈希冲突的几率。例如,如果您使用每个散列的低12位执行此操作,则您的散列冲突会少得多 - 数据结构可能是4k 32位数,或16k。