在Java中实现的"最快"散列函数,比较文件的一部分

car*_*oud 15 java comparison performance hash-function

我需要在Java中比较实例"File"的两个不同文件,并希望使用快速哈希函数来执行此操作.

想法: - 散列文件1中的20个第一行 - 散列文件2中的20个第一行 - 比较两个散列并返回true(如果它们相等).

我想使用Java中实现的"最快"哈希函数.你会选哪一个?

Sim*_* G. 28

如果你想要速度,不要哈希!特别是不像MD5那样的加密哈希.这些散列设计为不可逆转,不能快速计算.您应该使用的是校验和 - 请参阅java.util.zip.Checksum及其两个具体实现.Adler32的计算速度非常快.

任何基于校验和或散列的方法都容易受到冲突的影响,但您可以通过RSYNC的方式使用两种不同的方法来最小化风险.

算法基本上是:

  • 检查文件大小是否相等
  • 将文件分成大小为N字节的块
  • 计算每对匹配块的校验和并进行比较.任何差异证明文件都不一样.

这允许早期检测差异.您可以通过使用不同的算法或不同的块大小一次计算两个校验和来改进它.

结果中的更多位表示发生冲突的可能性更小,但是一旦超过64位,就会超出Java(和计算机的CPU)可以原生处理的速度,因此速度变慢,因此FNV-1024不太可能给你假阴性但速度慢得多.

如果它完全与速度有关,那么只需使用Adler32即可接受,很少会检测到差异.这真的很罕见.这些校验和用于确保互联网可以发现传输错误,以及您多久出现错误的数据?

它真的是准确性,你必须比较每个字节.没有别的办法.

如果您可以在速度和准确度之间做出妥协,那么有很多选择.