确定文件是否重复

时间:2010-05-11 17:15:30

标签: java file comparison checksum platform-agnostic

是否有可靠的方法来确定两个文件是否相同?例如,两个具有相同大小和类型的文件可能是也可能不是相同的二进制文件(是的,我知道它不是一个单词)。我假设比较文件的一个或两个校验和将有所帮助,但我想知道:

  1. 确定是否两个校验和的可靠性如何 文件不同;两个不同文件具有相同校验和的几率是多少?
  2. 可靠性会增加吗? 应用额外的校验和 比较?
  3. 哪种校验和算法 最有效和/或最可靠的?
  4. 感谢任何想法,建议或想法!

    P.S。这个代码是用在nix系统上运行的Java编写的,但通用或平台无关的输入是最有帮助的。

4 个答案:

答案 0 :(得分:6)

除非您逐字节地比较它们,否则无法确切知道两个文件是否相同。除非您检查集合中的每个项目,否则它类似于您无法保证集合包含或不包含给定对象的方式。

校验和基本上是一个哈希。它们是否足以满足您的目的取决于您的应用程序的关键任务。当然可以创建具有低冲突风险的哈希函数;毕竟,即使在他们保护敏感数据并且您不希望在您的帐户上拥有第二个有效密码的情况下,也会对密码进行哈希处理。除非您为银行编写代码,否则强校验和算法应提供非常好的近似值。

当且仅当不同的校验和算法使用不同的散列函数时,使用多个校验和将提高可靠性。

leonbloy的回答已经解决了你的第三个问题; MD5和SHA-1很常见。

答案 1 :(得分:5)

1) Very reliable
2) Not theoretically
3) SHA-1

答案 2 :(得分:0)

任何标准校验和算法(MD5)都可以为大多数现实生活场景提供可靠的测试。如果您需要更高的可靠性,请转到SHA。 http://en.wikipedia.org/wiki/Cryptographic_hash_function#Cryptographic_hash_algorithms

答案 3 :(得分:0)

任何校验和都会在极少数情况下给你误报。如果你可以忍受,那很好。如果没有,则执行此操作的方法是首先进行校验和比较,如果校验和相等则进行逐字节测试。逐字节测试将很少进行,因此在很多比较中平均的成本将非常小。然而,当你的大多数比较预计会返回“真实”时,情况并非如此。

它还取决于您正在测试的文件数量。计算高可靠性校验和几乎与进行比较一样昂贵 - 如果每个文件大约进行一次比较,那么进行比较可能会更便宜。