0

在我正在开发的 Android 应用程序上,我可以通过其 CRC32、MD5 或 SHA1 识别文件(我有包含这些列表的 xml 文件)。

我读到CRC32的计算速度更快,所以我决定使用这个,但是计算一个4MB文件的CRC32大约需要3分钟,我需要在更短的时间内对更多甚至更大的文件进行计算。这是具有双 1.5GHz CPU 和 1GB RAM 的设备的常规时间吗?如果不是,可能是由于堆限制吗?如果我编译一个原生 C 来通过 shell 计算 CRC 会改进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 GB。我在 2 GHz i7 上获得 1.2 GB/s。

您需要向 CRC 算法提供大块。不要一次输入一个字节。

顺便说一句,我使用硬件 crc32 指令在 2 GHz i7 上获得 18 GB/s。

md5 和 sha1 均约为 0.35 GB/s。sha256 约为 0.18 GB/s。

于 2013-04-11T16:07:55.007 回答