MD5 хэш отличается

Я не знаю, как реализовать эти несколько строк от php до java ..

$varInHex = "\x22\x33\xAd\xB5\x2b\xE6\x22\x33\x12\x36\x22\x31\xCA\x22\x11\x41\x62\x21\x22\x01\x55\x22\x71\x42\x10\x36";<br/><br/> $result = md5($varInHex); echo $result; 

Ну, я попытался преобразовать его, но у меня получился другой результат!

 byte[] seq20 = new byte[]{(byte)0x22,(byte)...etc...}; String str = seq20.toString(); String result = md5(str); System.out.println(result); public static String md5(String source) { try { MessageDigest md = MessageDigest.getInstance("MD5"); byte[] bytes = md.digest(source.getBytes("UTF-8")); return getString(bytes); } catch (Exception e) { e.printStackTrace(); return null; } } private static String getString(byte[] bytes) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < bytes.length; i++) { byte b = bytes[i]; String hex = Integer.toHexString((int) 0x00FF & b); if (hex.length() == 1) { sb.append("0"); } sb.append(hex); } return sb.toString(); } 

результат в java отличается от результата в php ..

Не могли бы вы мне помочь?? Заранее спасибо 🙂

Не можете ли вы использовать seq20 напрямую, не преобразовывая его так, чтобы строка? Я бы сделал это так:

 md.update( seq20 ); byte[] md5sum = md.digest(); BigInteger bigInt = new BigInteger(1, md5sum); output = bigInt.toString(16); while ( output.length() < 32 ) { output = "0"+output; } 

Ни один из двух других ответов утвердительно неверен, но с точки зрения элегантности рассмотрим следующие

 String MD5(String... strings) { MessageDigest md = null; try { md = MessageDigest.getInstance("MD5"); for(final String s : strings) { md.update(s.getBytes()); } } catch (NoSuchAlgorithmException ex) { throw new RuntimeException("MD5 Cryptography Not Supported"); } final BigInteger bigInt = new BigInteger(1, md.digest()); return String.format("%032x", bigInt); } 

edit: Использование String... varargs полностью необязательно, но делает эту функцию немного проще, поскольку она позволяет избежать накладных расходов на конкатенацию строк в вызывающей функции.

Принятое решение:

 md.update( seq20 ); byte[] md5sum = md.digest(); BigInteger bigInt = new BigInteger(1, md5sum); output = bigInt.toString(16); if ( output.length() == 31 ) { output = "0"+output; } 

содержит реализацию, которая будет терпеть неудачу 1/256 раз, потому что выход md5sum может иметь более одного начального нуля. Пример ввода md5, который вызывает эту ошибку: «15446: 68106» (без кавычек).

Я рекомендую использовать apache commons DigestUtils.md5Hex, если вам нужен md5, соответствующий реализации php.

Взгляните на: http://www.sergiy.ca/how-to-make-java-md5-and-sha-1-hashes-compatible-with-php-or-mysql/

Эта ссылка была размещена здесь: Java md5, способ PHP

Я предполагаю, что PHP оценивает это как строку, а не шестую. И Java делает это, как вы ожидаете.