2

私は php のような同様のことを意味しsha1_fileます。

boost のような外部ライブラリを必要としない非常に素晴らしくコンパクトなスクリプトを見つけました: http://code.google.com/p/smallsha1/source/browse/trunk/sha1.cpp

しかし、ファイルのサイズがたとえば 10GB の場合にファイル ストリームを渡す方法はありますか?

4

2 に答える 2

5

その正確なコードはストリームを取ることができません。

ループを見てくださいwhile (currentBlock <= endOfFullBlocks)。実際のハッシュ コードを通じて一度に 64 バイトを実行します。したがって、ストリームを取得するようにこのコードを変更するには、64 バイトをストリームから取得するのではなく、ストリームから読み取る必要がありますsarray(これは input と同じデータを指しますsrc)。

読み取りごとに 64 バイトは 10GB のデータを読み取る効率的な方法ではないため、実際には 2 番目のループを導入することをお勧めします。1 つはファイルからより大きなチャンクを読み取り、もう 1 つはその 64 バイト ブロックをハッシュに入れます。

もちろん、64 の倍数ではない入力データの「残り」部分を処理するようにコードを変更する必要もあります。

または、「init」、「update」、「finish」/「digest」関数を使用して別の SHA1 実装を見つけ、代わりにそれを使用します。このようなインターフェースの考え方は、ストリームを読み取るのに便利なサイズのデータ​​のチャンクを渡して、好きなだけ「更新」を呼び出すことです。

于 2012-12-18T12:11:51.550 に答える
0

大きなファイルの場合、ファイルの一部をメモリマップしたり、合計を計算したり、ファイルの次の部分に再マップして合計を続行したりできます。

于 2012-12-18T12:10:56.247 に答える