CRC计算花费太多时间

时间:2013-04-11 13:06:55

标签: java android crc

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

我读到CRC32的计算速度更快,所以我决定使用这个,但要计算一个4MB文件的CRC32需要大约3分钟,我需要在更多甚至更大的文件中进行时间更短。这是具有双1.5GHz CPU和1GB RAM的设备的常规时间吗?如果没有,是否可能是由于堆限制?如果我编译本机C以通过shell Process.exec来计算CRC,那么会改进吗?

编辑代码: 我添加了一个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();

2 个答案:

答案 0 :(得分:4)

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

java nio甚至可以为大文件提供更多帮助。

答案 1 :(得分: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。