Shell-Script

同時計算多個摘要(md5,sha256)?

  • June 3, 2020

假設磁碟 I/O 和空閒 RAM 是瓶頸(雖然 CPU 時間不是限制),是否存在可以一次計算多個消息摘要的工具?

我對計算大文件(以千兆字節為單位)的 MD-5 和 SHA-256 摘要特別感興趣,最好是並行計算。我試過openssl dgst -sha256 -md5了,但它只使用一種算法計算雜湊。

預期行為的虛擬碼:

for each block:
   for each algorithm:
       hash_state[algorithm].update(block)
for each algorithm:
   print algorithm, hash_state[algorithm].final_hash()

簽出pee(" tee standard input to pipes") 從moreutils. 這基本上等同於 Marco 的tee命令,但輸入起來更簡單一些。

$ echo foo | pee md5sum sha256sum
d3b07384d113edec49eaa6238ad5ff00  -
b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c  -
$ pee md5sum sha256sum <foo.iso
f109ffd6612e36e0fc1597eda65e9cf0  -
469a38cb785f8d47a0f85f968feff0be1d6f9398e353496ff7aa9055725bc63e  -

您可以使用for循環來遍歷各個文件,然後tee 結合使用程序替換(在 Bash 和 Zsh 等中工作)來管道到不同的校驗和。

例子:

for file in *.mkv; do
 tee < "$file" >(sha256sum) | md5sum
done

您還可以使用兩個以上的校驗和:

for file in *.mkv; do
 tee < "$file" >(sha256sum) >(sha384sum) | md5sum
done

這樣做的缺點是校驗和不知道文件名,因為它是作為標準輸入傳遞的。如果這不可接受,您必須手動發出文件名。完整範例:

for file in *.mkv; do
 echo "$file"
 tee < "$file" >(sha256sum) >(sha384sum) | md5sum
 echo
done > hashfilelist

引用自:https://unix.stackexchange.com/questions/163747