如何查找具有相同内容的所有文件?

时间:2010-11-08 12:30:33

标签: filesystems hash

这是interview question:“给定一个包含大量文件的目录,找到具有相同内容的文件”。我建议使用哈希函数来生成文件内容的哈希值,并仅比较具有相同哈希值的文件。是否有意义 ?

接下来的问题是如何选择哈希函数。你会为此目的使用SHA-1吗?

4 个答案:

答案 0 :(得分:6)

我宁愿使用哈希作为第二步。首先按文件大小排序dir并进行散列并仅在存在重复大小时进行比较,这样可以在一般情况下提高搜索范围。

答案 1 :(得分:4)

与大多数面试问题一样,它更能激发对话,而不是单一的答案。

如果文件非常少,那么简单地进行逐字节比较可能会更快,直到达到不匹配的字节(假设你这样做)。如果有很多文件,计算哈希值可能会更快,因为您不必在多个文件的块中转移磁盘。当您逐步浏览文件以消除潜力时,可以通过抓取每个文件越来越大的块来加速此过程。如果它们是足够的文件,也可能需要在多个服务器之间分配问题。

我会从比SHA-1更快更简单的哈希函数开始。 SHA-1是加密安全的,在这种情况下不一定需要。例如,在我的非正式测试中,Adler 32的速度提高了2-3倍。您还可以使用更弱的推定测试,而不是重新测试任何匹配的文件。这个决定还取决于IO带宽和CPU功率之间的关系,如果你有一个更强大的CPU,使用更具体的哈希来节省在后续测试中重新读取文件,如果你有更快的IO,重读可能比做更便宜不必要的昂贵的哈希。

另一个有趣的想法是在处理文件时使用启发式方法,根据文件大小,计算机速度和文件熵来确定最佳方法。

答案 2 :(得分:2)

是的,建议的方法是合理的,SHA-1或MD5足以完成该任务。这是a detailed analysis for the very same scenarioa question specifically on using MD5。不要忘记你需要尽可能快的哈希函数。

答案 3 :(得分:1)

是的,哈希是第一个浮现在脑海中的人。对于您的特定任务,您需要采用最快的哈希函数。 Adler32会起作用。在您的情况下碰撞不是问题,因此您不需要加密强大的功能。