ディスク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()
pee
( "tee standard input to pipes
")from 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
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
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速度です。
あなたはいつも 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
インスタンスをファイルとして持つと、それらはすべて並行して実行され、対応するファイル名に出力が保存されます。ただし注意が必要ですが、ファイルが多数ある場合、これは重くなる可能性があります。
マルチスレッド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 -
_
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
を実行して取得します。
または、ソースコードは