2013-04-11 361 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。