我需要比较 Java 中实例“文件”的两个不同文件,并希望使用快速散列函数来做到这一点。
想法: - 对文件 1 中的前 20 行进行哈希处理 - 对文件 2 中的前 20 行进行哈希处理 - 比较两个哈希值,如果它们相等则返回 true。
我想使用 Java 中实现的“最快”哈希函数。你会选哪一个?
我需要比较 Java 中实例“文件”的两个不同文件,并希望使用快速散列函数来做到这一点。
想法: - 对文件 1 中的前 20 行进行哈希处理 - 对文件 2 中的前 20 行进行哈希处理 - 比较两个哈希值,如果它们相等则返回 true。
我想使用 Java 中实现的“最快”哈希函数。你会选哪一个?
如果你想要速度,不要散列!尤其不是像 MD5 这样的加密哈希。这些哈希被设计为无法逆转,计算速度不快。您应该使用的是校验和 - 请参阅java.util.zip.Checksum
它的两个具体实现。Adler32 的计算速度非常快。
任何基于校验和或散列的方法都容易受到冲突的影响,但您可以像 RSYNC 那样使用两种不同的方法,从而将风险降至最低。
该算法基本上是:
这允许及早发现差异。您可以通过使用不同的算法或不同的块大小一次计算两个校验和来改进它。
结果中的更多位意味着发生冲突的机会更少,但是一旦超过 64 位,您就超出了 Java(和计算机的 CPU)可以本机处理的范围,因此速度变慢,因此 FNV-1024 不太可能给您一个假阴性,但要慢得多。
如果一切都与速度有关,只需使用 Adler32 并接受很少会检测不到差异的事实。这真的很罕见。像这样的校验和用于确保互联网可以发现传输错误,以及您多久会收到错误数据?
这真的与准确性有关,您必须比较每个字节。没有其他方法会起作用。
如果您可以在速度和准确性之间妥协,那么有很多选择。
如果您在同一系统上同时比较两个文件,则无需对它们进行哈希处理。只需在读取两个文件时比较两个文件中的字节是否相等。如果您想在不同时间比较它们或者它们在不同的地方,那么 MD5 将既快速又足够。除非您正在处理非常大的文件,否则没有太多理由需要更快的文件。甚至我的笔记本电脑每秒也可以散列数百兆字节。
如果要验证它们是否相同,还需要对整个文件进行哈希处理。否则,如果您想快速检查,不妨只检查大小和上次修改时间。如果文件真的很大并且你相信中间不会改变,你也可以检查文件的开头和结尾。如果您不处理数百兆字节,您不妨检查每个文件的每个字节。