複数のダイジェスト(md5、sha256)を同時に計算しますか?

複数のダイジェスト(md5、sha256)を同時に計算しますか?

ディスクI / Oと利用可能なRAMがボト​​ルネック(CPU時間は制限ではありません)であると仮定すると、複数のメッセージダイジェストを同時に計算できるツールはありますか?

私は特に大容量ファイル(GB単位)のMD-5およびSHA-256ダイジェストを並列に計算することに興味があります。私はこれを試しましたが、openssl dgst -sha256 -md5ハッシュ値を計算するために1つのアルゴリズムしか使用しません。

予想される動作の疑似コード:

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

答え1

次から見るpee(" tee standard input to pipes")moreutils。これは基本的にMarcoのteeコマンドと同じですが、入力するのは少し簡単です。

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

答え2

forループを使用して個々のファイルを繰り返してから、プロセスの置き換えtee (BashやZshなどの場合)と組み合わせて別のチェックサムにパイプすることができます。

例:

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

3つ以上のチェックサムを使用することもできます。

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

答え3

残念ながら、opensslユーティリティは複数のダイジェストコマンドを許可しません。複数のファイルに対して同じコマンドを実行する方が一般的な使用パターンのようです。 FWIW、私のシステム(Mepis 11)のopensslユーティリティバージョンにはshaコマンドとsha1コマンドのみがあり、他のshaバリアントはありません。しかし、sha256sumとmd5sumというプログラムがあります。

ここにあなたが望むことを行う簡単なPythonプログラム、Dual_hash.pyがあります。私のコンピュータ(Intel Pentium 4 2.00GHz、2G RAM)であるYMMVには、64kブロックサイズが最も適しているようです。小さなファイルの場合、md5sumとsha256sumを連続して実行するのとほぼ同じ速度です。しかし、より大きなファイルの場合ははるかに高速です。たとえば、1967063040バイトファイル(mp3ファイルでいっぱいのSDカードのディスクイメージ)では、md5sum + sha256sumには約1m44.9sがかかり、Dual_hash.pyには1m0.312sがかかります。

二重ハッシュ.py

#! /usr/bin/env python

''' Calculate MD5 and SHA-256 digests of a file simultaneously

    Written by PM 2Ring 2014.10.23
'''

import sys
import hashlib

def digests(fname, blocksize):
    md5 = hashlib.md5()
    sha = hashlib.sha256()
    with open(fname, 'rb') as f:
        while True:
            block = f.read(blocksize)
            if not block:
                break
            md5.update(block)
            sha.update(block)

    print("md5: %s" % md5.hexdigest())
    print("sha256: %s" % sha.hexdigest())

def main(*argv):
    blocksize = 1<<16 # 64kB
    if len(argv) < 2:
        print("No filename given!\n")
        print("Calculate md5 and sha-256 message digests of a file.")
        print("Usage:\npython %s filename [blocksize]\n" % sys.argv[0])
        print("Default blocksize=%d" % blocksize)
        return 1

    fname = argv[1]

    if len(argv) > 2:
        blocksize = int(sys.argv[2])

    print("Calculating MD5 and SHA-256 digests of %r using a blocksize of %d" % (fname, blocksize))
    digests(fname, blocksize)

if __name__ == '__main__':
    sys.exit(main(*sys.argv))

私はこのプログラムのC / C ++バージョンが少し速くなると思いますが、ほとんどの作業はhashlibモジュールによって実行されるため、それほど高速ではありません。はいC(またはC ++)で書かれています。前述のように、大容量ファイルのボトルネックはIO速度です。

答え4

Pythonスクリプトのマルチスレッドが実行時間を短縮できるかどうか疑問に思いました。digest.pythreading.Threadthreading.Queueおよびを使用してhashlib複数のファイルのハッシュを計算するスクリプト。

マルチスレッドPythonの実装は実際にpeecoreutilsを使用するよりも少し高速です。一方、Javaは...まあ。結果は以下で確認できます。このコミットメッセージ:

比較のために2.3GiBファイルの場合(最小/平均/max/sd 秒 (n=10):

  • おしっこ sha256sum md5sum < ファイル: 16.5/16.9/17.4/.305
  • python3 summary.py-sha256-md5 <ファイル:13.7/15.0/18.7/1.77
  • python2 summary.py-sha256-md5 <ファイル:13.7/15.9/18.7/1.64
  • jacksum -a sha256+md5 -F '#CHECKSUM{i} #FILENAME': 32.7/37.1/50/6.91

ハッシュ出力はcoreutilsによって生成された出力と互換性があります。長さはハッシュアルゴリズムに依存するため、ツールはそれを印刷しません。使用法(pee比較のために追加):

$ ./digest.py -sha256 -md5 digest.py
c217e5aa3c3f9cfaca0d40b1060f6233297a3a0d2728dd19f1de3b28454975f2  digest.py
b575edf6387888a68c93bf89291f611c  digest.py
$ ./digest.py -sha256 -md5 <digest.py
c217e5aa3c3f9cfaca0d40b1060f6233297a3a0d2728dd19f1de3b28454975f2  -
b575edf6387888a68c93bf89291f611c  -
$ pee sha256sum md5sum <digest.py
c217e5aa3c3f9cfaca0d40b1060f6233297a3a0d2728dd19f1de3b28454975f2  -
b575edf6387888a68c93bf89291f611c  -

関連情報