代码之家  ›  专栏  ›  技术社区  ›  Michael

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

  •  3
  • Michael  · 技术社区  · 14 年前

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

    下一个问题是如何选择散列函数。你会使用SHA-1吗?

    4 回复  |  直到 14 年前
        1
  •  4
  •   Zack Bloom    14 年前

    像大多数面试问题一样,这更像是激发谈话,而不是只有一个答案。

    如果文件非常少,那么在达到不匹配的字节之前(假设是这样),简单地逐字节比较可能会更快。如果有许多文件,计算散列可能会更快,因为您不必从多个文件中以块形式移动磁盘读取。这个过程可能是通过抓取每个文件越来越大的块来加快的,因为您通过文件来消除潜在的可能性。如果多个服务器的文件足够多,那么也可能需要hit来将问题分发给多个服务器。

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

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

        2
  •  6
  •   Dr. belisarius    14 年前

    我宁愿用哈希作为第二步。首先按文件大小对dir进行排序,然后仅在存在重复大小的情况下进行哈希和比较,在一般情况下可能会大大改善搜索范围。

        3
  •  2
  •   Community holdenweb    7 年前

    是的,建议的方法是合理的,并且SHA-1或MD5将足以完成该任务。这里是 a detailed analysis for the very same scenario 这是 a question specifically on using MD5 . 别忘了你需要一个尽可能快的散列函数。

        4
  •  1
  •   Eugene Mayevski 'Callback    14 年前

    是的,首先想到的是散列。对于您的特定任务,您需要使用最快的哈希函数。阿德勒32就行了。在您的例子中,碰撞不是一个问题,所以您不需要密码强函数。