【问题标题】:golang -Comparing two txt filesgolang - 比较两个txt文件
【发布时间】:2015-12-02 00:06:58
【问题描述】:

我想知道文件更改时的内容

有一个简单的txt文件

textOne 1,2,3,4,5,6,7,8,9,10

我把它改成

textTwo 1,2,3,4,7,7,7,8,9,10

所以“一”和“5,6”改为“二”、“7,7”

我可以找到循环改变的东西。但我想知道是否有更好的方法来检查

【问题讨论】:

标签: string text go slice


【解决方案1】:

使用标准的第三方库,而不是循环使用,进行小幅优化。

我过去使用的库之一是Go port of google-diff-match-patch(与@Not_a_golfer 在评论中建议的库相同。)。

您可以通过首先计算两个文件的sha2 哈希来优化这一点,如果它们不相同,则可以假设它们已更改,否则(可能)它们相同,并跳过 diff 操作。

这种优化的一个缺点是,由于鸽子洞原理,理论上可以为不同的内容具有相同的哈希值。但是,发生这种情况的可能性很小。

编辑(基于@elithrar 的评论): 由于计算非常大的文件的哈希值可能很耗时。您可以分块计算sha2(大小取决于sha2 系列的特定哈希算法)。这使您能够及早退出,并提高速度。

【讨论】:

  • 您还可以使用缓冲读取器来读取文件的块(例如,4K 块),对它们进行哈希处理并进行比较。这避免了对大文件进行哈希处理,提高了速度(你提前退出)并且应该避免冲突。 SHA-2 应该是合适的。
  • 滚动哈希函数也是一回事,因此,如果您要获得最大性能,那就是要走的路。如果核心算法还没有在 Go 中实现,我会感到惊讶。 en.wikipedia.org/wiki/Rolling_hash