代码之家  ›  专栏  ›  技术社区  ›  Todd R

确定文件是否重复

  •  6
  • Todd R  · 技术社区  · 15 年前

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

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

    感谢您的任何想法、建议或想法!

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

    4 回复  |  直到 15 年前
        1
  •  5
  •   zaf    15 年前
    1) Very reliable
    2) Not theoretically
    3) SHA-1
    
        2
  •  6
  •   Pops Atula    15 年前

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

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

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

    你的第三个问题已经得到了莱昂布罗伊的回答;MD5和SHA-1很常见。

        3
  •  0
  •   leonbloy    15 年前

    任何标准的校验和算法(如MD5)都将为您提供一个可靠的测试,适用于大多数现实场景。如果你需要更多的可靠性,去sha。 http://en.wikipedia.org/wiki/Cryptographic_hash_function#Cryptographic_hash_algorithms

        4
  •  0
  •   DJClayworth    15 年前

    对于极少数情况,任何校验和都会给您一个假阳性。如果你能忍受,那就好。如果不是这样,那么做的方法是先进行校验和比较,如果校验和等于,则逐字节测试。逐字节测试将很少进行,因此在许多比较中的平均成本将非常小。然而,当您的大多数比较预期返回“true”时,情况并非如此。

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