我正在从事一个项目,其中涉及文件的哈希计算。该项目就像一个文件备份服务,所以当一个文件从客户端上传到服务器时,我需要检查该文件在服务器上是否已经可用。我为文件生成CRC-32哈希,然后将哈希发送到服务器以检查它是否已经可用。
如果文件不在服务器中,我过去会将文件作为512 KB区块发送以进行重复数据消除,并且我必须计算每个512 KB区块的哈希值。文件大小有时可能只有几GB,并且多个客户端将连接到服务器。所以我真的需要一个文件的快速和LightWeight散列算法。有什么想法吗?
附注:我已经注意到StackOverflow中的一些散列算法问题,但答案并不是对这类任务所需的散列算法进行比较。我敢打赌,这对很多人都很有用。
发布于 2012-12-13 01:08:28
实际上,CRC32既没有最好的速度,也没有最好的发行版。
这是意料之中的:按照今天的标准,CRC32已经相当老了,创建于CPU不是32/64位宽也不是OoO-Ex的时代,分布属性也没有错误检测那么重要。自那以后,所有这些要求都发生了变化。
为了评估散列算法的速度和分布特性,Austin Appleby创建了优秀的SMHasher包。结果的简短摘要是presented here。我建议选择Q.Score为10 (完美分布)的算法。
发布于 2012-11-30 22:33:38
您说您正在使用CRC-32,但是想要更快的散列。CRC-32非常基础,而且速度非常快。我认为I/O时间会比散列时间长得多。您还需要一个不会发生冲突的散列。也就是说,两个不同的文件或512 KB区块获得相同的散列值。您可以查看任何加密散列,如MD5 (不要用于安全应用程序)或SHA1。
发布于 2015-01-04 15:17:01
如果只使用crc-32检查文件是否重复,则会得到错误的副本,因为不同的文件可能具有相同的CRC-32。你最好使用sha-1,crc-32和md5都太弱了。
https://stackoverflow.com/questions/13646574
复制相似问题