如何并行化命令 sha256sum 或其他哈希命令?

如何并行化命令 sha256sum 或其他哈希命令?

我想并行化哈希计算过程,因为我有大量的文件数量和大小。当我看到这些命令的 CPU 使用情况时,我感到很沮丧,因为它们只使用一个线程;我怎样才能并行化这些?

sha256sum foo.mp4
OR
openssl -dgst sha256 foo.mp4

答案1

要跨文件并行化,您可以使用 GNU Parallel:

parallel sha256sum ::: *

单个文件的并行哈希可以通过使用 Merkle 树的某些哈希函数来完成。b3sum就是这样一个工具。

答案2

或者,您可以升级到支持硬件 SHA256 计算的 CPU,例如较新的 Intel 或 AMD CPU。我的 Ryzen 3700X 计算 SHA256 哈希和的速度非常快,比计算简单得多的算法 MD5 快得多。检查sha_ni/proc/cpuinfo.

或者你可以使用布莱克3这是很多(几乎 15 倍)快点即使纯粹用软件实现:

在此输入图像描述

答案3

xargs可以-P选择并行运行多个作业。它远不如 Ole Tange 的parallel程序灵活,但对于大多数简单的并行化任务来说它已经足够了。

例如:

find . -name '*.mp4' -print0 | xargs -0r -n 1 -P 0 openssl dgst -sha256
  • -P 0告诉 xargs 并行运行尽可能多的作业(例如,在我的 32 线程 Threadripper 1950x 上,它将并行运行 32 个openssl作业)

  • -n 1告诉 xargs 仅使用一个参数运行每项作业。虽然 1 个作业对于可以在命令行上处理多个文件名而言并不是最佳选择openssl dgst,但您几乎总是希望将-n(或-L) 选项与xargs -P.

    否则,它会尝试将尽可能多的参数放入每个命令行中 - 通常只会导致一项工作,除非您有数以万计的参数。在 Linux 上,命令行长度限制通常为 200 万个字符,即 2097152(使用 进行检查getconf ARG_MAX)。这允许有很多文件名。

    最佳方法是计算您拥有的参数数量,并将其除以您想要并行运行的作业数量。例如

    t=32
    numfiles=$(find .//. -name '*.mp4' | grep -c //)
    let n=numfiles/t
    find . -name '*.mp4' -print0 | xargs -0r -n "$n" -P "$t" openssl dgst -sha256
    

注意:-P不是 xargs 的标准 POSIX 选项。需要 GNU 或 *BSD xargs。也许还有其他一些版本。

相关内容