2013-04-30 2 views
2

У меня возникли проблемы с моими хэшами md5 в java. Чтобы проверить обновления файлов, я получаю листинг с моего сервера и сравниваю файлы с локальным списком.Файл Java MD5 и PHP md5_file отличается

Хеши файла сервера создаются с использованием функции md5_file() в php. Мой код Java для вычисления контрольной суммы файла дает мне другой результат, чем исключение.

Некоторые отлаживать выход, чтобы увидеть разницу:

00000.res:b3359dec77910db596b095be7aa49000 
00001.res:84411f08999df4fb6ddab1345d21c72c 
00002.res:be305453dd435f4a019a1c7b444aff8b 
00003.res:66df5d3462287ba6df7bdaa5c32484f2 
00004.res:283d977b128e0e7b07de8d4b867f24c9 
00000.res:1f012efee3c2c414512a5f19e5f598dd < server 
00001.res:fdb212a9280815d98a67be7fe23408d7 < server 
00002.res:64151232cc0e6939a024966e8159151c < server 
00003.res:f1c9859d2d1f431b76425b11a6a1090e < server 
00004.res:0393da6442a0ec153ded0bb6e7e1085c < server 

Функция Java:

private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; 

public static String getMD5(File file) throws NoSuchAlgorithmException, IOException { 
    MessageDigest md = MessageDigest.getInstance("MD5"); 
    InputStream is = new FileInputStream(file); 

    try { 
     is = new DigestInputStream(is, md); 

     byte[] buffer = new byte[4 * 1024]; 
     int read; 

     while ((read = is.read(buffer)) != -1) { 
      md.update(buffer, 0, read); 
     } 

    } finally { 
     is.close(); 
    } 

    final byte[] data = md.digest(); 
    final int l = data.length; 
    final char[] out = new char[l << 1]; 

    for (int i = 0, j = 0; i < l; i++) { 
     out[j++] = HEX_DIGITS[(0xF0 & data[i]) >>> 4]; 
     out[j++] = HEX_DIGITS[0x0F & data[i]]; 
    } 

    return new String(out); 
} 

Я пытался искать с помощью Google, но все я получаю md5 хэши для строк. Я уверен, что моя проблема должна что-то сделать с помощью функции md.update(). Скопировать буфер неправильно?

+1

@jchapa это не дубликат. У ОП есть определенная ошибка в этом коде. – Alnitak

ответ

1

Насколько я вижу, что вы не должны называть .update вообще - вся точка DigestInputStream является то, что он обновляет дайджест на лету как вы читаете это.

Вам нужно всего лишь позвонить .digest в конце, чтобы получить окончательный результат.

+0

Спасибо, что решил. Поэтому 'DigestInputStream' обновляет свой хэш во время выполнения, хорошо знать! – spaceemotion

+0

@SpaceEmotion пожалуйста upvote и принять ... – Alnitak

+0

Мне не удалось - мне пришлось ждать 9 минут ... – spaceemotion