Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 确定文件是否为重复文件_Java_File_Comparison_Checksum_Platform Agnostic - Fatal编程技术网

Java 确定文件是否为重复文件

Java 确定文件是否为重复文件,java,file,comparison,checksum,platform-agnostic,Java,File,Comparison,Checksum,Platform Agnostic,是否有可靠的方法确定两个文件是否相同?例如,两个具有相同大小和类型的文件可能是相同的,也可能不是相同的二进制文件(是的,我知道这不是一个真正的单词)。我认为比较一个或两个文件校验和会有所帮助,但我想知道: 校验和在确定两个 档案不同;两个不同文件具有相同校验和的可能性有多大 可靠性会增加多少 应用附加校验和 比较 将使用哪种校验和算法 最有效和/或最可靠 任何想法、建议或想法都将不胜感激 另外,这方面的代码是用运行在nix系统上的Java编写的,但通用或平台无关输入最有帮助。任何标准校验和算法(

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

  • 校验和在确定两个 档案不同;两个不同文件具有相同校验和的可能性有多大
  • 可靠性会增加多少 应用附加校验和 比较
  • 将使用哪种校验和算法 最有效和/或最可靠
  • 任何想法、建议或想法都将不胜感激


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

    任何标准校验和算法(如MD5)都将为大多数实际场景提供可靠的测试。如果你需要更高的可靠性,去SHA

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

    1) Very reliable
    2) Not theoretically
    3) SHA-1
    
    校验和基本上是一个散列。它们是否适合您的目的取决于您的应用程序的任务关键性。当然,创建一个具有低冲突风险的哈希函数是可能的;毕竟,密码是散列的,即使在保护敏感数据的情况下,您也不希望在您的帐户上有第二个有效密码。除非您为银行编写代码,否则强校验和算法应该提供非常好的近似值

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


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

    任何校验和都会在极少数情况下给您一个假阳性。如果你能接受的话,很好。如果不是,那么方法是首先进行校验和比较,如果校验和相等,则进行逐字节测试。逐字节测试很少进行,因此在大量比较中的平均成本将非常小。但是,当您的大多数比较结果都会返回“true”时,情况并非如此


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

    2)应该是“不实际”还是“理论上”?从理论上讲,可靠性当然会提高。啊,你是说他指的是有几个校验和?就像有一个sha1和md5一样?@zaf:是的,至少我希望他的意思是:)。@IVlad是正确的,两个文件可能有相同的校验和,使用多个校验和会降低这种可能性,因此,理论上这会提高可靠性。然而,校验和在实践中是非常可靠的,因此没有必要这样做。此外,CRC32为这个应用程序提供了一个更好的选择:我们不关心恶意输入,而且它比SHA1快得多。@BlueRaja:可能是因为您在90年代被卡住了吗?;-)据我所知,本世纪编写的每个应用程序都至少使用MD5来实现此目的。考虑到现代CPU每秒可以读取500 MB的数据(仅使用单核!),大多数硬盘驱动器甚至无法每秒读取那么多数据。此外,MD5比CRC具有更好的位分布,这意味着仅比较MD5校验和的前两个字节后,两个文件被视为不同的可能性比CRC校验和大得多。CRC校验和可能只在最后一个字节不同。
    校验和基本上是散列。
    相反,散列基本上是校验和,但要求更严格
    当然可以创建一个冲突风险较低的哈希函数
    哈希函数的设计是为了在统计上尽可能降低冲突风险。其他任何东西都不是散列<代码>强校验和算法应该提供[哈希]的非常好的近似值。哈希和校验和是类似的野兽,用途非常不同。CRC32是一个伟大的校验和,但一个糟糕的散列。BCrypt是一个很好的散列,但是校验和很糟糕(速度太慢)。+1来平衡BlueRaja的“清晰混淆”。如果你想一想,校验和函数和散列函数是一样的,唯一的区别是你如何使用结果。不公平,Blue Raja的解释在2分钟前我开始之前的评论时还没有出现。现在,作为回应,你的批评对于校验和或散列不是必不可少的。相反,你是说只有好的散列函数才是散列,好的校验和才是校验和。@BlueRaja,我们进入语义学。覆盖Java的
    hashCode()
    方法为每个对象返回相同的值是完全合法的,尽管这很愚蠢。出于这个问题的目的,我认为将哈希定义为将输入数据操纵成一个相对较小、可能唯一的结果是合理的。与Ukko的评论类似。@Lord:啊,我明白了,我们对“哈希”使用了两种不同的定义——我所说的(这已成为术语“哈希”的常见含义),而你所说的是哈希表(等等)所使用的。我已经习惯于讨论加密散列(例如,其他答案提到了sha1和md5),我一定是疯了。如果你编辑你的答案,我将删除否决票。额外的思考食物。。。我正在做一些类似于剔除重复文件的工作,发现做分部求和大大加快了过程。在第一个4k上计算SHA-1。如果它们是相同的,则执行整个文件。您还可以直接比较前4k字节,在