Как получить md5 из нескольких изображений в короткие сроки? - PullRequest
1 голос
/ 04 мая 2019

В моем приложении я генерирую 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 файлов взяты и отображены в виде рециркулятора.

...