Контрольная сумма Zip-файла md5 - каждый раз по-разному

У меня есть приложения для Android, которые получают контрольную сумму md5 zip-файла. Я использую его для сравнения файла с файлом на сервере. Моя проблема в том, что каждый раз, когда я пытаюсь сгенерировать md5 для одного и того же файла, контрольная сумма отличается. Я публикую свои методы здесь. Можете ли вы сказать мне, что не так?

private static String fileMD5(String filePath) throws NoSuchAlgorithmException, IOException {
        InputStream inputStream = null;
        try {
            inputStream = new FileInputStream(filePath);
            byte[] buffer = new byte[1024];
            MessageDigest digest = MessageDigest.getInstance("MD5");
            int numRead = 0;
            while (numRead != -1) {
                numRead = inputStream.read(buffer);
                if (numRead > 0)
                    digest.update(buffer, 0, numRead);
            }
            byte [] md5Bytes = digest.digest();
            return convertHashToString(md5Bytes);
        } catch (Exception e) {
            return "ERROR";
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (Exception e) { }
            }
        }
    }

    private static String convertHashToString(byte[] md5Bytes) {
        String returnVal = "";
        for (int i = 0; i < md5Bytes.length; i++) {
            returnVal += Integer.toString(( md5Bytes[i] & 0xff ) + 0x100, 16).substring(1);
        }
        return returnVal;
    }

person dephinera    schedule 06.02.2015    source источник
comment
Я не вижу ничего в вашем коде, чтобы объяснить, почему вы получаете разные результаты. Наиболее вероятное объяснение состоит в том, что ваши данные отличаются от запуска к запуску. Даже если вы указываете этот метод на одно и то же имя файла, вы получите разные результаты, если содержимое файла каким-либо образом изменится между запусками.   -  person John Bollinger    schedule 06.02.2015
comment
Ваш код выглядит нормально... Я бы рекомендовал сначала проверить, всегда ли вы читаете одно и то же количество байтов из файла.   -  person Jamie    schedule 06.02.2015
comment
Окей, спасибо. Я попытаюсь :)   -  person dephinera    schedule 06.02.2015
comment
Я напечатал число байтов, и каждый раз это одно и то же.   -  person dephinera    schedule 06.02.2015


Ответы (1)


я пытаюсь решить ту же проблему. Я не знаю, как это решить, но я знаю причину :).

Причина в том, что zip-файл содержит как минимум информацию о временных метках файлов. И это то, что вы меняете md5sum. Каждая запись zip одинакова, но этот результат изменения информации метаданных для md5.

Возможно, вы уже нашли ответ где-то еще.

person Michal Šiplák    schedule 10.12.2015