Am пытается хэш моих строк и придумал следующий код:String.getBytes («UTF-8») не является независимым от платформы?
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.security.NoSuchAlgorithmException;
import java.security.MessageDigest;
import sun.misc.BASE64Encoder;
public class JavaTest {
public static void main (String[] args) throws UnsupportedEncodingException, NoSuchAlgorithmException {
String rawString = "9498131529";
System.out.println(Charset.defaultCharset());
System.out.println(rawString);
MessageDigest digest = MessageDigest.getInstance("MD5");
digest.update(rawString.getBytes("UTF-8"));
BASE64Encoder encoder = new BASE64Encoder();
byte hashedBytes[] = (new String(digest.digest(), "UTF-8")).getBytes();
System.out.println(encoder.encode(hashedBytes));
}
}
я был под впечатлением, что этот кусок кода должен быть независимой от платформы, так как, когда я пытаюсь получить байты из строки I задав тип кодировки «UTF-8».
Но когда я побежал код на моей среде Mac, Дев и постановка среды я получил следующий результат: Mac
MacRoman
9498131529
XElaLD8UPzE/P1sWDz8/Pw==
Dev:
US-ASCII
9498131529
XElaLD8UPzE/P1sWDz8/Pw==
Олень ING
UTF-8
9498131529
XElaLO+/vRTvv70x77+977+9WxYP77+977+977+9
Моя конфигурация:
Mac
> sw_vers
ProductName: Mac OS X
ProductVersion: 10.9
BuildVersion: 13A603
Dev
> cat /proc/version
Linux version 2.6.21.7-2.fc8xen-ec2-v1.0 (gcc version 4.1.2 20070925 (Red Hat 4.1.2-33)) #2 SMP Tue Sep 1 10:04:29 EDT 2009
Балетмейстер
> cat /proc/version
Linux version 3.2.0-31-virtual (gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)) #50-Ubuntu SMP Fri Sep 7 16:36:36 UTC 2012
Что я здесь отсутствует? Почему система алгоритма хеширования независима? И я считаю, что MD5 должен быть независимым от платформы в соответствии со спецификацией. Я ошибаюсь в своих предположениях?
Пожалуйста, дайте мне знать, если вам нужна дополнительная информация!
Стадии где вы спускоподъемная дайджест и из строки ('новой строки (digest.digest(), "UTF-8") GetBytes (.) ') выглядит подозрительно. (И ненужно - вы должны, вероятно, основывать 64-й дайджест.) Возможно, дайджест не может быть действительным UTF-8, и то, что вы видите, может быть другой обработкой ошибок декодирования. – millimoose
Собственно, подождите, наверное, именно там, где все идет не так. '.getBytes()' без аргумента кодирует строку в кодировке по умолчанию, а MacRoman и US-ASCII могут быть достаточно похожи, чтобы совпадение приводило к такому же результату. Использование '.getBytes (« UTF-8 »)' * должно * привести вас к одинаковому поведению повсюду, но это все еще не так. – millimoose
@millimoose Спасибо за ваши данные! :) Я думаю, Стефан избил тебя до ответа. –