0

私が開発しているAndroidアプリでは、CRC32、MD5、またはSHA1を介してファイルを認識できます(これらのリストを含むxmlファイルがあります)。

CRC32 の方が計算が速いと読んだので、これを使用することにしましたが、4MB のファイルの CRC32 を計算するには約 3 分かかります。これは、デュアル 1.5 GHz CPU と 1 GB RAM を搭載したデバイスにとって通常の時間ですか? そうでない場合、ヒープの制限が原因でしょうか? シェルを介して CRC を計算するためにネイティブ C をコンパイルすると改善されProcess.execますか?

編集コード: BufferedInputStream を追加したところ、約 7 秒かかりました。ただし、35MB ファイルの場合は 1 分です。

InputStream fi = new BufferedInputStream(new FileInputStream(f));

int gByte = 0;
CRC32 gCRC = new CRC32();
while ((gByte = fi.read()) != -1) {
    gCRC.update(gByte);
}
fi.close();
4

2 に答える 2

4
byte[] buf = new byte[1024*64];
while ((gByte = fi.read(buf)) > 0) {
    gCRC.update(buf, 0, gByte);
}
fi.close();

java nio は、大きなファイルの場合はもう少し役立つかもしれません。

于 2013-04-11T14:18:33.753 に答える
2

適切なソフトウェア CRC-32 実装は、最新のプロセッサで 1 秒あたり 1 GB 以上を処理できるはずです。2 GHz の i7 で 1.2 GB/s が得られます。

CRC アルゴリズムに大きなチャンクを供給する必要があります。一度に 1 バイトずつフィードしないでください。

ところで、ハードウェアの crc32 命令を使用して、2 GHz の i7 で 18 GB/秒を得ています。

md5 と sha1 はどちらも約 0.35 GB/s です。sha256 は約 0.18 GB/秒です。

于 2013-04-11T16:07:55.007 に答える