Java CRC计算花费太多时间

Java CRC计算花费太多时间,java,android,crc,Java,Android,Crc,在我正在开发的Android应用程序上,我可以通过其CRC32、MD5或SHA1识别文件(我有一个包含这些文件列表的xml文件) 我读到CRC32的计算速度更快,所以我决定使用这个,但要计算4MB文件的CRC32大约需要3分钟,我需要在更短的时间内对更多甚至更大的文件进行计算。对于具有双1.5GHz CPU和1GB RAM的设备,这是正常时间吗?如果不是,是否是由于堆限制?如果我用Process.exec编译一个本机C来通过shell计算CRC,这会有所改进吗 编辑代码: 我添加了一个Buffe

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

我读到CRC32的计算速度更快,所以我决定使用这个,但要计算4MB文件的CRC32大约需要3分钟,我需要在更短的时间内对更多甚至更大的文件进行计算。对于具有双1.5GHz CPU和1GB RAM的设备,这是正常时间吗?如果不是,是否是由于堆限制?如果我用
Process.exec
编译一个本机C来通过shell计算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();
JavaNIO甚至可能对大型文件有更大的帮助


java nio甚至可能对大文件有更大的帮助。

一个好的软件CRC-32实现应该能够在现代处理器上每秒处理超过1 GB的数据。我在2GHz i7上获得1.2Gb/s的速度

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

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


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

一个合适的软件CRC-32实现应该能够在现代处理器上每秒处理超过1 GB的数据。我在2GHz i7上获得1.2Gb/s的速度

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

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


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

请添加您的校验和代码,因为它可能会导致加密API使用不好……如何计算crc32?我的30岁微型计算机配备了2MHz 8位6502处理器,可以以大约相同的速率计算crc32。对于一个现代设备来说,它的速度慢得可笑。请发一些代码。几乎可以肯定的是,您将时间花在I/O上,而不是CRC计算上。正如所怀疑的那样。添加一个BufferedInputStream,或者一次读取一个byte[]数组而不是一个字节,您的问题就会消失。请添加您的校验码,因为它可能会导致糟糕的加密API使用……您如何计算crc32?我的30岁微型计算机配备了2MHz 8位6502处理器,可以以大约相同的速率计算crc32。对于一个现代设备来说,它的速度慢得可笑。请发一些代码。几乎可以肯定的是,您将时间花在I/O上,而不是CRC计算上。正如所怀疑的那样。添加一个BufferedInputStream,或者一次读取一个byte[]数组而不是一个字节,问题就会消失。
byte[] buf = new byte[1024*64];
while ((gByte = fi.read(buf)) > 0) {
    gCRC.update(buf, 0, gByte);
}
fi.close();