c++ - 大文件和 512 KB block 的最快和轻量级散列算法 [C、Linux、MAC、Windows]

标签 c++ hash hashalgorithm

我正在从事一个涉及计算文件哈希值的项目。该项目就像一个文件备份服务,因此当文件从客户端上传到服务器时,我需要检查该文件是否已在服务器中可用。我为文件生成一个 CRC-32 哈希,然后将哈希发送到服务器以检查它是否已经可用。

如果文件不在服务器中,我过去常常将文件作为 512 KB block 发送 [用于重复数据删除],我必须为每个 512 KB block 计算哈希值。文件大小有时可能只有几 GB,并且多个客户端将连接到服务器。所以我真的需要一个快速和轻量级的文件哈希算法。任何想法..?

P.S:我已经注意到 StackOverflow 中的一些哈希算法问题,但答案并不完全是此类任务所需的哈希算法的比较。我敢打赌这对一群人来说真的很有用。

最佳答案

实际上,CRC32既没有最好的速度,也没有最好的分布。

这是意料之中的:按照今天的标准,CRC32 已经很老了,并且是在 CPU 不是 32/64 位宽也不是 OoO-Ex 的时代创建的,而且分布属性不如错误检测重要。自那以后,所有这些要求都发生了变化。

为了评估哈希算法的速度和分布属性,Austin Appleby 创建了出色的 SMHasher包裹。 结果的简短摘要是 presented here . 我建议选择 Q.Score 为 10(完美分布)的算法。

关于c++ - 大文件和 512 KB block 的最快和轻量级散列算法 [C、Linux、MAC、Windows],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13646574/

相关文章:

c++ - 是否有用于 Subversion 的 Windows API 二进制文件,或者我是否必须构建 SVN 才能从 Windows C++ 调用 API?

c++ - 为什么会有所谓的身份转换呢?

ruby-on-rails - 尝试循环遍历哈希中的项目并仅返回某些项目

java - 如何从对象的地址计算 hashCode()?

security - 系统如何知道密码何时包含先前密码的部分内容?

c# - SHA256.Create() 和 HashAlgorithm.Create ("SHA-256"之间有什么区别吗?

c++ - 决定启动时在 QT 中打开哪个窗口

c++ - 互斥体能否在不显式保护对象的情况下确保对象的线程可见性?

c# - 如何在 C# 中将 CRC32 计算为有符号整数?