健壮和快速的校验和算法?

时间:2020-03-06 14:37:09  来源:igfitidea点击:

在以下用例中,我们可以推荐哪种校验和算法?

我想生成小的JPEG文件(每个〜8 kB)的校验和,以检查内容是否已更改。不幸的是,不能使用文件系统的修改日期。
校验和不必在密码学上很强,但应有力地表明任何大小的变化。

第二个标准是速度,因为应该可以每秒处理至少数百个图像(在现代CPU上)。

计算将在具有多个客户端的服务器上完成。客户端通过千兆TCP将图像发送到服务器。因此,没有磁盘I / O成为瓶颈。

解决方案

如果我们有许多小文件,则瓶颈将是文件I / O,而可能不是校验和算法。

哈希函数列表(可以认为是校验和)可以在这里找到。

有什么原因不能使用文件系统的修改日期来确定文件是否已更改?那可能会更快。

CRC

  • 出现CRC-32的主要原因是计算便宜
  • 之所以想到任何一种I / O,主要是因为这将成为此类任务的限制因素;)
  • 问题不是计算校验和,而是将图像存入内存以计算校验和。
  • 阶段2:将图片存入内存并计算校验和
  • 同样重要的是:多线程:建立一个管道,如果有多个CPU内核,则可以并行处理多个映像。

有许多快速CRC算法可以解决这个问题:
http://www.google.com/search?hl=zh_CN&q=fast+crc&aq=f&oq=

编辑:为什么讨厌? CRC完全合适,其他答案也证明了这一点。由于未指定语言,因此Google搜索也是合适的。这是一个古老而古老的问题,已经解决了很多次,不可能给出明确的答案。

在zlib标头中提供的adler32的发布速度明显快于crc32,但准确性略有降低。

CRC32可能已经足够好了,尽管我们极有可能会发生冲突,例如,由于两个版本生成的校验和相同,因此修改后的文件看起来好像不是这样。因此,为避免这种可能性,我建议使用MD5,它会足够快,并且发生碰撞的可能性会降低到几乎无穷小。

正如其他人所说的那样,对于许多小文件,我们真正的性能瓶颈将是I / O,因此问题正在解决。如果我们发布更多细节,可能还会有人提出一种整理方法。

我们最重要的要求是"检查内容是否已更改"。

如果最重要的是检测文件中的任何更改,则应选择MD-5,SHA-1甚至SHA-256.

鉴于我们指出校验和在密码上不好,因此我建议使用CRC-32的原因有三个。 CRC-32在8K文件上具有良好的汉明距离。 CRC-32的计算速度至少比MD-5快一个数量级(第二个要求)。有时同样重要,CRC-32仅需要32位来存储要比较的值。 MD-5需要4倍的存储空间,而SHA-1则需要5倍的存储空间。

顺便说一句,在计算哈希值时,可以通过在文件长度前面添加任何技术来加以增强。

根据Luke指向的Wiki页面,MD5实际上比CRC32更快!

我已经在Windows Vista上使用Python 2.6进行了尝试,并得到了相同的结果。

以下是一些结果:

crc32:162.481544276 MBps
md5:224.489791549 MBps

crc32:168.332996575 MBps
md5:226.089336532 MBps

crc32:155.851515828 MBps
md5:194.943289532 MBps

我也在考虑相同的问题,我很想使用Adler-32的Rsync变体来检测文件差异。

以上只是一个后记; JPEG使用有损压缩,压缩程度可能取决于用于创建JPEG的程序,系统上的调色板和/或者位深度,显示伽玛,图形卡以及用户设置的压缩级别/颜色设置。因此,在字节级别比较在不同计算机/平台上构建的jpeg或者使用不同软件的jpeg非常困难。