我正在研究不同处理器上 SHA1、SHA-256 和 SHA-512 的速度(计算哈希所需的时间)。
这些哈希算法能否被分解以在多个核心/线程上运行?
我正在研究不同处理器上 SHA1、SHA-256 和 SHA-512 的速度(计算哈希所需的时间)。
这些哈希算法能否被分解以在多个核心/线程上运行?
如果你想并行执行计算单个哈希(不管是1、256还是512位)的过程,那么答案是遗憾的,不行。这是因为SHA变换函数的定义方式。它操作固定大小的块,但每个块的转换输出需要下一个块,因此无法并行运行计算。
显然,可以并行运行多个哈希,用于不同的输入字符串,但我假设你已经知道这一点了。
如果你只想使用底层SHA变换生成大输入的摘要,那么可以定义任意方案来分割输入,然后并行为每个段生成摘要块。然后再组合这些块等等。
类似于这样:
| ------------------ large input ---------------------------------------------|
| b0 | b1 | b2 | | | | bn |
您可以并行生成H(b0),H(b1)... H(bn)
。
然后,生成H_OUT = H(H(b0)+H(b1)+... + H(bn))
(其中+
符号可以是连接或简单的异或运算,但这些很可能不具有密码学强度)。
这种方法将从多个核心中受益,但H_OUT
将不能等价于计算原始大输入的单个哈希。
H(b0) XOR H(b1)
与H(b1) XOR H(b0)
相同,因此这不会生成保护块顺序的签名。异或本身不是加密操作,因此“异或不具有加密强度”并没有太多意义。它在密码算法中的使用可以是具有加密强度或没有加密强度。 - Nicolas Dusart