В моем приложении я генерирую md5 из примерно 3000 изображений размером до 700 МБ.
У меня уже есть Arraylist путей к файлам изображений.
Проблема заключается в затратах времени до 55 секунд. Я хочу сократить его до минимума, по крайней мере, до 8-12 секунд, если возможно, или даже меньше.
Это алгоритм генерации md5
public static String getMd5OfFile(String filePath)
{
String returnVal = "";
try
{
InputStream input = new FileInputStream(filePath);
byte[] buffer = new byte[15360];
//byte[] buffer = new byte[1024];
// byte[] buffer = new byte[8192];
MessageDigest md5Hash = MessageDigest.getInstance("MD5");
int numRead = 0;
while (numRead != -1)
{
numRead = input.read(buffer);
if (numRead > 0)
{
md5Hash.update(buffer, 0, numRead);
}
}
input.close();
byte [] md5Bytes = md5Hash.digest();
for (int i=0; i < md5Bytes.length; i++)
{
returnVal += Integer.toString( ( md5Bytes[i] & 0xff ) + 0x100, 16).substring( 1 );
}
}
catch(Throwable t) {t.printStackTrace();}
return returnVal.toUpperCase();
}
карта принимает строку как ключ, значение как Arraylist
HashMap<String,Arraylist<String>> map = new HashMap<String, String>();
Это алгоритм поиска одинаковых дубликатов md5
void Duplicatefinder(ArrayList<String> filepaths)
{
HashMap<String,String> checkmap = new HashMap<String, String>();
for (String filepath : filepaths)
{
String md5 = getMd5OfFile(filepath);
if(checkmap.containsKey(md5)) {
if (!map.containsKey(md5)) {
map.put(md5, new ArrayList<String>());
String original = checkmap.get(md5);
ArrayList<String> list = map.get(md5);
list.add(original);
map.put(md5,list);
}
ArrayList<String> list = map.get(md5);
list.add(filepath);
map.put(md5, list);
}
else {
checkmap.put(md5,filepath);
}
}
}
вызывает Duplicate finder в асинхронной задаче, выполняет в фоновом режиме и показывает загрузку анимации пользователю, пока все md5 файлов взяты и отображены в виде рециркулятора.