在python中为大型文件创建校验和的最快方法

在python中为大型文件创建校验和的最快方法,python,multithreading,md5,crc32,hashlib,Python,Multithreading,Md5,Crc32,Hashlib,我需要通过网络传输大型文件,并需要每小时为它们创建校验和。所以生成校验和的速度对我来说至关重要 不知何故,我无法使zlib.crc32和zlib.adler32在Windows XP Pro 64位计算机上处理大于4GB的文件。我想我已经达到32位的限制了?使用hashlib.md5我可以得到一个结果,但问题是速度。为4.8GB文件生成md5大约需要5分钟。任务管理器显示流程仅使用一个核心 我的问题是: 有没有办法使crc在大文件上工作?我更喜欢使用crc而不是md5 如果没有,那么有没有办法加

我需要通过网络传输大型文件,并需要每小时为它们创建校验和。所以生成校验和的速度对我来说至关重要

不知何故,我无法使zlib.crc32和zlib.adler32在Windows XP Pro 64位计算机上处理大于4GB的文件。我想我已经达到32位的限制了?使用hashlib.md5我可以得到一个结果,但问题是速度。为4.8GB文件生成md5大约需要5分钟。任务管理器显示流程仅使用一个核心

我的问题是:

  • 有没有办法使crc在大文件上工作?我更喜欢使用crc而不是md5
  • 如果没有,那么有没有办法加快md5.hexdigest()/md5.digest的速度?或者在本例中是任何hashlib hexdigest/digest?也许可以将其拆分为多线程进程?我该怎么做

  • PS:我正在研究类似的东西,比如“资产管理”系统,有点像svn,但资产由大型压缩图像文件组成。这些文件有微小的增量更改。散列/校验和用于检测更改和错误检测。

    您不可能使用多个核心来计算一个大文件的MD5散列,因为MD5的本质是:它期望消息被分块并按严格的顺序输入散列函数。然而,您可以使用一个线程将文件读入内部队列,然后在一个单独的线程中计算哈希值,以便。我不认为这会给您带来任何显著的性能提升


    处理一个大文件需要如此长的时间这一事实可能是由于“无缓冲”读取。试着一次读取16 Kb,然后将内容分块输入哈希函数。

    md5本身不能并行运行。但是,您可以将文件分为多个部分(并行)进行md5,并获取散列列表的md5

    然而,这假设散列不是IO限制的,我怀疑是这样的。正如安东·戈戈列夫(Anton Gogolev)所建议的那样——确保高效地读取文件(以2次幂的大数据块)。完成此操作后,请确保文件没有碎片

    对于新项目,还应选择诸如sha256之类的散列,而不是md5


    对于4Gb文件,zlib校验和是否比md5快得多?

    您尝试过该模块吗?

    这是一个算法选择问题,而不是库/语言选择问题

    主要有两点考虑:

    • 磁盘I/O对总体性能的影响有多大
    • 错误检测功能的预期可靠性是什么
    显然,第二个问题的答案类似于“允许某些假阴性”,因为任何32位哈希相对于4Gb消息的可靠性,即使在中等噪声的信道中,也不会是绝对的

    假设可以通过多线程改进I/O,我们可以选择不需要对完整消息进行顺序扫描的哈希。相反,我们可以并行处理文件,对各个部分进行散列,或者合并散列值,或者附加它们,以形成更长、更可靠的错误检测设备

    下一步可能是将文件的这种处理形式化为有序的部分,并将它们作为有序的部分进行传输(在接收方端重新粘合在一起)。这种方法,再加上关于文件生成方式的附加信息(例如,它们可以通过append进行专门修改,如日志文件),甚至可以限制所需的哈希计算量。这种方法增加的复杂性需要根据快速CRC计算的愿望进行加权


    旁注:Alder32不限于低于特定阈值的消息大小。这可能只是ZlibAPI的一个限制。(顺便说一句,我找到的关于zlib.adler32的参考资料使用了缓冲区,而且……在我们的大量消息的上下文中,这种方法是要避免的,以流式流程为准:从文件中读取一点,计算,重复…)

    首先,任何CRC算法中都没有任何固有的东西可以阻止它们处理任意长度的数据(但是,特定的实现很可能会施加限制)

    但是,在文件同步应用程序中,这可能无关紧要,因为当文件变大时,您可能不希望散列整个文件,而只希望将其分块。如果散列整个文件,并且两端的散列值不同,则必须复制整个文件。如果散列固定大小的块,则只需复制散列已更改的块。如果对文件的大部分更改都是本地化的(例如数据库),那么这可能需要更少的复制(并且更容易将每个块的计算分散到多个核心上)

    至于散列算法本身,基本的折衷是速度与不冲突(两个不同的数据块产生相同的散列)。CRC-32速度很快,但只有2^32个唯一值,可能会出现冲突。MD5的速度要慢得多,但有2^128个唯一值,因此几乎永远不会看到碰撞(但理论上仍然可能)。较大的散列(SHA1、SHA256等)具有更多的唯一值,但速度较慢:我怀疑您是否需要它们:您担心意外冲突,而数字签名应用程序则担心故意(恶意)设计的冲突


    听起来您正在尝试做一些与rsync实用程序非常相似的事情。你能用rsync吗?

    在XP中,你可能会遇到文件大小的限制。64位为您提供了更多的寻址空间(删除了每个应用程序2GB(或更多)的寻址空间),但可能对文件大小问题没有任何作用。

    有什么原因不能只使用rsync吗?您是否需要检查它们的完整性(使用适当的算法,这是实际问题)仅仅因为您需要