私は php のような同様のことを意味しsha1_file
ます。
boost のような外部ライブラリを必要としない非常に素晴らしくコンパクトなスクリプトを見つけました: http://code.google.com/p/smallsha1/source/browse/trunk/sha1.cpp
しかし、ファイルのサイズがたとえば 10GB の場合にファイル ストリームを渡す方法はありますか?
その正確なコードはストリームを取ることができません。
ループを見てくださいwhile (currentBlock <= endOfFullBlocks)
。実際のハッシュ コードを通じて一度に 64 バイトを実行します。したがって、ストリームを取得するようにこのコードを変更するには、64 バイトをストリームから取得するのではなく、ストリームから読み取る必要がありますsarray
(これは input と同じデータを指しますsrc
)。
読み取りごとに 64 バイトは 10GB のデータを読み取る効率的な方法ではないため、実際には 2 番目のループを導入することをお勧めします。1 つはファイルからより大きなチャンクを読み取り、もう 1 つはその 64 バイト ブロックをハッシュに入れます。
もちろん、64 の倍数ではない入力データの「残り」部分を処理するようにコードを変更する必要もあります。
または、「init」、「update」、「finish」/「digest」関数を使用して別の SHA1 実装を見つけ、代わりにそれを使用します。このようなインターフェースの考え方は、ストリームを読み取るのに便利なサイズのデータのチャンクを渡して、好きなだけ「更新」を呼び出すことです。
大きなファイルの場合、ファイルの一部をメモリマップしたり、合計を計算したり、ファイルの次の部分に再マップして合計を続行したりできます。