用Java实现的“最快”哈希函数,比较文件的一部分

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

要回复问题请先登录注册