2013-04-11 160 views
0

在我正在开发的Android应用程序中,我可以通过其CRC32,MD5或SHA1(我拥有带有这些列表的xml文件)识别文件。CRC计算需要太多时间

,我读了CRC32是要计算的速度更快,所以我决定用这一个,但计算大约需要3分钟4MB的文件CRC32,我需要做的更多,更大的文件时间更短。这是双频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(); 
+0

可能是IO太慢 – BlackJoker 2013-04-11 13:08:18

+1

请添加您的校验码,因为它可能会导致错误的加密API使用... – Kartoch 2013-04-11 13:08:35

+1

如何计算crc32? – BlackJoker 2013-04-11 13:11:54

回答

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

的Java NIO甚至可能会帮助更多的大型文件的位。

+0

那个byte []救了我的命。谢谢! – Vektor88 2013-04-11 16:33:48

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。