Hash 什么哈希算法是可并行的?利用多核CPU优化大文件哈希

Hash 什么哈希算法是可并行的?利用多核CPU优化大文件哈希,hash,md5,parallel-processing,sha1,checksum,Hash,Md5,Parallel Processing,Sha1,Checksum,我对优化一些大文件的散列(优化挂钟时间)感兴趣。I/O已经进行了充分优化,I/O设备(本地SSD)的容量仅为25%左右,而其中一个CPU内核已完全耗尽 我有更多的核心可用,在未来可能会有更多的核心。到目前为止,如果我碰巧需要同一个文件的多个散列,比如说一个MD5和一个SHA256,我只能访问更多的内核。我可以使用相同的I/O流为两个或多个哈希算法提供数据,并且我可以免费完成更快的算法(直到挂钟时间)。据我所知,大多数散列算法中,每一个新的位都会改变整个结果,而并行执行这项任务本身就具有挑战性/不

我对优化一些大文件的散列(优化挂钟时间)感兴趣。I/O已经进行了充分优化,I/O设备(本地SSD)的容量仅为25%左右,而其中一个CPU内核已完全耗尽

我有更多的核心可用,在未来可能会有更多的核心。到目前为止,如果我碰巧需要同一个文件的多个散列,比如说一个MD5和一个SHA256,我只能访问更多的内核。我可以使用相同的I/O流为两个或多个哈希算法提供数据,并且我可以免费完成更快的算法(直到挂钟时间)。据我所知,大多数散列算法中,每一个新的位都会改变整个结果,而并行执行这项任务本身就具有挑战性/不可能

主流散列算法是否可并行化?
是否有任何可并行化的非主流散列(并且至少有一个示例实现可用)


由于未来的CPU将趋向于更多的内核和时钟速度的稳定,有没有办法提高文件哈希的性能?(除了液氮冷却超频?)或者它本身是不可并行的?

在这个领域实际上有很多研究正在进行。美国国家标准与技术研究所(National Institute of Standards and Technology)目前正在举办设计下一代政府级哈希函数的竞赛。这方面的大多数建议都是可并行的

一个例子:


维基百科对竞赛现状的描述:

你有什么类型的SSD?我的MD5的C实现在单个Intel Core2内核(2.4 GHz,不是最新的Intel)上以400 MB/s的速度运行。您真的有支持1.6 GB/s带宽的SSD吗?我想要同样的

树哈希可以应用于任何哈希函数。有一些微妙之处,Skein规范试图解决这些问题,在函数本身中集成了一些元数据(这对性能没有太大影响),但Skein的“树模式”并不是提交给SHA-3的“树模式”。即使将Skein选择为SHA-3,树模式散列的输出也不会与“普通Skein”的输出相同

希望在某个时候能够定义一个标准来描述通用树哈希。现在没有。然而,一些协议已经定义为支持使用Tiger散列函数的自定义树散列,名称为“TTH”(Tiger树散列)或“THEX”(树散列交换格式)。TTH的规格似乎有点难以捉摸;我发现一些关于已经移动或永久消失的草稿的参考资料

不过,我对这个概念还是有点怀疑。它有点简洁,但只有在读取数据的速度比单核处理数据的速度快的情况下,它才能提供性能提升,并且,给定正确的函数和正确的实现,单核每秒可以散列相当多的数据。分布在多个核心上的树散列需要将数据发送到适当的核心,1.6 GB/s不是有史以来最小的带宽

SHA-256和SHA-512速度不是很快。在SHA-3候选处理器中,假设采用64位模式的x86处理器,其中一些可以实现高速(在我的2.4 GHz Intel Core2 Q6600上超过300 MB/s,使用单核——这也是我可以从SHA-1中获得的),例如宝马、沙巴尔或斯金。从密码学的角度来说,这些设计有点太新了,但MD5和SHA-1已经在密码学上“被破坏”(在MD5的情况下相当有效,而在理论上是SHA-1),所以第二轮SHA-3候选中的任何一个都应该是好的


当我设定“seer”上限时,我预见处理器将继续变得比RAM快,以至于散列成本将与内存带宽相形见绌:CPU在等待来自主RAM的数据时将有时钟周期可用。在某个时候,整个线程模型(一个大的RAM用于多个内核)将不得不进行修改。

您没有说您需要哈希来做什么。 如果您不想与外界交换,而只是为了内部使用,只需将每个文件分成块,计算并存储所有校验和。然后,只需向每个内核抛出一个块,就可以使用多个内核

想到的两种解决方案是将文件划分为固定大小的块(更简单,但在不需要所有功能的较小文件中使用较少的核心)或固定数量的块(将为每个文件使用所有核心)。实际上,这取决于您想要实现的目标和文件大小分布

另一方面,如果您需要外部世界的哈希值,正如您可以从其他回复中看到的那样,使用“标准”哈希值是不可能的(例如,如果您想发送SHA1哈希值以供其他人使用不同的工具进行检查),那么您必须找其他地方。比如在存储文件时计算散列,以便以后检索,或者在后台使用“空闲”内核计算散列,并存储以供以后检索


更好的解决方案取决于您的约束条件以及您可以在哪里投入空间、时间或cpu功率。

此外,我听说大多数当前的哈希算法都可以并行化,但我不确定这需要什么。显然,一种方法是自己决定对每个(比如)4k文件块进行散列,然后以某种方式组合散列。或许是XOR?发明自己的算法总是很危险的,所以如果你是为了防止恶意数据篡改而不是意外数据损坏,我就不会相信这一点。这里您建议的正是它如何实现并行化(显然它被称为“树散列”。)Skein有一个标准方法来指定叶大小、扇出和最大树高,以便使用相同参数的任何人都可以获得相同的散列结果。)那很重要