web-dev-qa-db-ja.com

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

ディスクI/Oと空き容量RAMがボトルネックである(CPU時間は制限ではありません)であるという前提で)、複数のメッセージダイジェストを一度に計算できるツールはありますか?

大きなファイル(ギガバイト単位のサイズ)の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()
25
Lekensteyn

pee( "tee standard input to pipes ")from moreutils 。これは基本的にMarcoのteeコマンドと同等ですが、タイプするのが少し簡単です。

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

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
10
Marco

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

これは簡単なPythonプログラム、dual_hash.py、それはあなたがやりたいことをします。64kのブロックサイズは私のマシン(2GのRAMを搭載したIntel Pentium 4 2.00GHz)、YMMVに最適であるようです) 。小さなファイルの場合、その速度はmd5sumとsha256sumを連続して実行する場合とほぼ同じです。ただし、大きなファイルの場合は、はるかに高速です。たとえば、1967063040バイトのファイル(mp3ファイルでいっぱいのSDカードのディスクイメージ)、md5sum + sha256sumは約1分44.9秒、dual_hash.pyは1分0.312秒かかります。

dual_hash.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モジュールによって行われるため、isC(またはC++)で書かれています。また、前述のとおり、大きなファイルのボトルネックはIO速度です。

6
PM 2Ring

あなたはいつも GNU parallel のようなものを使うことができます:

echo "/path/to/file" | parallel 'md5sum {} & sha256sum {}'

または、2つのうちの1つをバックグラウンドで実行します。

md5sum /path/to/file & sha256sum /path/to/file

または、出力を別のファイルに保存し、複数のジョブをバックグラウンドで実行します。

for file in *; do
    md5sum "$file" > "$file".md5 &
    sha256sum "$file" > "$file".sha &
done

それだけ多くのmd5sumおよびsha256sumインスタンスをファイルとして持つと、それらはすべて並行して実行され、対応するファイル名に出力が保存されます。ただし注意が必要ですが、ファイルが多数ある場合、これは重くなる可能性があります。

5
terdon

マルチスレッドPythonスクリプトが実行時間を短縮するかどうかの好奇心から、私はこれを作成しました _digest.py_ スクリプトを使用して_threading.Thread_、_threading.Queue_およびhashlibは、複数のファイルのハッシュを計算します。

マルチスレッドのPython実装は、coreutilsでpeeを使用するよりも実際にわずかに高速です。一方、Javaは...です。結果は このコミットメッセージ にあります。

比較のために、2.3のファイルの場合GiB(min /avg/ max/sd secs for n = 10) :

  • おしっこsha256sum md5sum <ファイル:16.5 /16.9/ 17.4/.305
  • python3 digest.py -sha256 -md5 <ファイル:13.7 /15.0/ 18.7/1.77
  • python2 digest.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  -
_
3
Lekensteyn

Jacksumは、チェックサム、CRC、ハッシュ(メッセージダイジェスト)、およびファイルのタイムスタンプを計算および検証するための、プラットフォームに依存しない無料のユーティリティです。 (- jacksum man pageからの抜粋

これは大容量ファイルを認識し、最大8エクサバイト(= 8,000,000,000ギガバイト)までのファイルサイズを処理できます。オペレーティングシステムがそれぞれのファイルシステムを想定しているため、ファイルシステムも大容量ファイルを認識します。 http://www.jonelo.de/Java/jacksum/ から抜粋)

使用例:

jacksum -a md5+sha256 -F "#ALGONAME{i} (#FILENAME) = #CHECKSUM{i}" jacksum-testfile

出力例:

md5 (jacksum-testfile) = d41d8cd98f00b204e9800998ecf8427e
sha256 (jacksum-testfile) = e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Ubuntuでは、コマンドapt-get install jacksumを実行して取得します。

または、ソースコードは

1
pallxk