如何快速创建哈希函数以检查两个文件是否相同?
安全性不是非常重要。
编辑:我会通过网络连接发送文件,并确保双方的文件相同。
如何快速创建哈希函数以检查两个文件是否相同?
安全性不是非常重要。
编辑:我会通过网络连接发送文件,并确保双方的文件相同。
除非您使用的是非常复杂和/或缓慢的哈希算法,否则从磁盘加载数据所需的时间会比计算哈希值更长(除非您使用RAM磁盘或顶级SSD)。
因此,要比较两个文件,请使用以下算法:
这允许进行快速失败(如果大小不同,则知道文件不同)。
为了使事情更快,您可以计算一次哈希值并将其保存到文件中。还要将文件日期和大小保存到此额外文件中,以便在主文件更改时快速了解何时重新计算哈希值或删除哈希文件。
xxh128sum
在文件比较方面比使用像sha1
这样的加密哈希函数快得多...但我认为Aaron在他的回答中暗示了这一点,只是没有明确说明。然而,对于不那么有经验的用户来说,大多数预安装的哈希命令行工具都会针对加密安全进行优化,而不是速度。xxHash在许多存储库中都可用,包括Ubuntu(sudo apt install xxhash
)和OpenBSD(doas pkg_add -U xxhash
)。 - moo一种方法可能是使用简单的CRC-32算法,只有当CRC值相等时,才使用SHA1或其他更强大的哈希重新运行哈希。快速的CRC-32比安全的密码哈希更加有效。
xxhash声称在碰撞方面非常快且强大:
http://cyan4973.github.io/xxHash/
64位变体在64位处理器上运行的速度比32位更快,但总体而言在32位处理器上更慢(奇怪)。
http://code.google.com/p/crcutil 也被认为非常快(并利用硬件CRC指令,如果存在这些指令,则可能非常快,但如果您没有支持它们的硬件,则不够快)。不知道CRC32c是否像xxHash那样好(就碰撞而言)......
https://code.google.com/p/cityhash/ 似乎与crcutil类似且相关[可以编译成使用硬件CRC32c指令的代码]。
如果您“只想要最快的原始速度”,并且不太关心散列输出的随机分布质量(例如对于小集合或速度至关重要的情况),则此处提到了一些快速算法:http://www.sanmayce.com/Fastest_Hash/ (这些“不太随机”分布类型的算法,在某些情况下,“足够好”且非常快)。显然,FNV1A_Jesteress
是用于“长”字符串的最快算法,其他一些算法则可能适用于小字符串。 http://locklessinc.com/articles/fast_hash/ 似乎也相关。我没有研究它们的碰撞属性。
最新的热门技术似乎是https://github.com/erthink/t1ha, https://github.com/wangyi-fudan/wyhash, 以及xxhash也有稍微更新的版本。
编辑: (根据Steven Sudit的评论)
如果文件很小,需要注意!
Adler32的“加密”属性,或者说它的弱点,尤其是对于短消息而言已经广为人知。因此,建议在文件大小小于几千字节时避免使用所提出的解决方案。
然而,在问题中,OP明确寻求快速算法并放弃了安全方面的顾虑。此外,追求速度可能意味着处理的是“大型”文件而不是小文件。在这种情况下,Adler32,可能应用于每个5MB的文件块,并行计算,仍然是一个非常有效的答案。 Alder32以其简单和快速而闻名。此外,其可靠性虽然低于相同长度的CRC,但对于超过4000字节的消息是完全可以接受的。
SMhasher网站有一些基准测试,可直接进行性能比较,并注明/弱点,如果您有特定需求。
好的折衷方案:
xxdhash
非常快(以安全为代价),非常适合在内部进行文件比较任务,当安全不受关注时。二进制文件广泛可用,其中包括命令行实用程序。
优化: 您只需要对相同大小的文件运行哈希功能:https://unix.stackexchange.com/questions/339491/find-a-file-by-hash
示例用例:
我想检查一个大型照片目录,看看是否有一些重复的文件已经被添加进来了。在我的使用情况下,我没有与外部世界进行集成,也没有恶意操作者会尝试添加具有相同哈希的非重复照片(称为碰撞)。
安装:
“xxdhash” 可在许多发行版的软件仓库中获得。要在基于 Debian 的发行版上安装(包括 Ubuntu):为什么要使用哈希?
如果您想确保两个文件相等,那么根据定义,您将不得不读取整个文件(除非它们实际上是相同的文件,在这种情况下,您可以通过查看文件系统上的元数据来确定)。无论如何,没有理由进行哈希,只需阅读它们并查看它们是否相同即可。哈希会使其效率降低。即使哈希匹配,您仍然不确定文件是否真的相等。
编辑:在问题未指定任何关于网络的内容之前发布了此回答。它只是询问有关比较两个文件的问题。现在我知道文件之间存在网络跳跃,我会建议只使用MD5哈希,并完成它。