6

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

  1. 校验和在确定两个文件是否不同时有多可靠;两个不同文件具有相同校验和的可能性有多大?
  2. 应用额外的校验和比较会增加可靠性吗?
  3. 哪种校验和算法将是最有效和/或最可靠的?

任何想法,建议或想法表示赞赏!

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

4

4 回答 4

6

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

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

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

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

于 2010-05-11T17:33:13.150 回答
5
1) Very reliable
2) Not theoretically
3) SHA-1
于 2010-05-11T17:21:49.837 回答
0

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

于 2010-05-11T17:24:20.877 回答
0

对于极少数情况,任何校验和都会给您带来误报。如果你能忍受它,那很好。如果不是,那么执行此操作的方法是首先进行校验和比较,如果校验和相等,则进行逐字节测试。逐字节测试将很少进行,因此经过多次比较的平均成本将非常小。但是,当您的大多数比较预计返回“真”时,情况并非如此。

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

于 2010-05-11T18:04:36.147 回答