@Hakhagmon

Почему в php и java получаются разные md5?

Есть приложение на java, которое генерирует мд5.
public class start {
	 
    public static void main (String[] args) throws java.io.UnsupportedEncodingException, java.security.NoSuchAlgorithmException {
      java.io.PrintStream sysout = new java.io.PrintStream(System.out, true, "UTF-8");
 
      String utf8_string = "¤3¤119829406¤2";
      sysout.println(utf8_string);
 
      java.security.MessageDigest md5 = java.security.MessageDigest.getInstance("MD5");
      byte[] md5_byte_array = md5.digest(utf8_string.getBytes());
 
      java.math.BigInteger md5_biginteger = new java.math.BigInteger(1, md5_byte_array);
      sysout.println(md5_biginteger.toString(16));
    }
  }


в результате получим 808b085b44dfa7d1ba351f2f33a608de

если же использовать стандартную функцию md5 на php, то md5 получается другой.

<?
print_r(iconv('WINDOWS-1251', 'UTF-8', md5("¤3¤119829406¤2")));

print_r(md5("¤3¤119829406¤2"));
?>


в обоих случаях получим - fcee312dd5fbbfbfb81e0e92d2ab0af6

я предполагаю, что тут проблема в кодировке, и что-то нужно еще добавить в php скрипт.
  • Вопрос задан
  • 747 просмотров
Решения вопроса 1
@bizon2000
Java-программист
Вот здесь: utf8_string.getBytes() не задана явно кодировка UTF-8, поэтому используется дефолтная кодировка платформы. Если нужно, чтобы PHP-скрипт выдавал такую же сумму, как java, задайте в нем соответствующую вашей платформе кодировку, в вашем случае это "ISO-8859-1"
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@MamOn
Вот тут работает, как ожидается: ideone.com/kg3ktQ

А всё потому, что системная кодировка там UTF-8. Проблемы именно в вызове метода String.getBytes(), как указали ранее. Но, если код нельзя менять, то можно запускать приложение в другой системной кодировке, передавая параметр -Dfile.encoding=UTF-8 в командную строку запуска java. Например:

java -Dfile.encoding=UTF-8 -jar ваша_программа.jar
Ответ написан
dimonchik2013
@dimonchik2013
non progredi est regredi
правильно предполагаете

смотрите, как сделано в Питоне - никаких кодировок:
https://docs.python.org/3/library/hashlib.html
Ответ написан
Комментировать
miraage
@miraage
Старый прогер
Проверил кучу md5 онлайн сервисов.
Везде выдает fcee312dd5fbbfbfb81e0e92d2ab0af6.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы