2013-04-11 3 views
0

В приложении для Android, которое я разрабатываю, я могу распознать файл через его CRC32, MD5 или SHA1 (у меня есть xml-файл со списком из них).Расчет CRC занимает слишком много времени

Я читал, что CRC32 быстрее вычисляется, поэтому я решил использовать этот, но для вычисления CRC32 файла размером 4 МБ требуется около 3 минут, и мне нужно сделать это на более и более больших файлах в более короткое время. Это обычное время для устройства с двойным процессором 1,5 ГГц и 1 ГБ оперативной памяти? Если нет, это может быть из-за ограничений кучи? Улучшится, если я скомпилирую собственный C для вычисления CRC через оболочку с Process.exec?

EDIT код: Я добавил BufferedInputStream, и теперь это занимает около 7 секунд. Но 1 минуту для 35 МБ файла.

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

+1

Пожалуйста, добавьте свой код контрольной суммы, так как это может привести к неправильному использованию API криптографии ... – Kartoch

+1

Как вы caculate crc32? – BlackJoker

ответ

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

Java NiO может даже помочь немного больше для больших файлов.

+0

Это байт [] спас мою жизнь. Благодаря! – Vektor88

2

Реализация достойного программного обеспечения CRC-32 должна обрабатывать более 1 ГБ в секунду на современных процессорах. Я получаю 1,2 ГБ/с на моем 2 ГГц i7.

Вам необходимо подавать большие куски в алгоритм CRC. Do не подавайте его по одному байту за раз.

Кстати, я получаю 18 ГБ/с на моем 2 ГГц i7 с помощью аппаратной команды crc32.

md5 и sha1 оба около 0,35 ГБ/с. sha256 составляет около 0,18 ГБ/с.

Смежные вопросы