我试图对我的字符串进行哈希处理并得出以下代码:
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));
}
}
我的印象是这段代码应该与平台无关,因为当我尝试从字符串中获取字节时,我指定了编码类型“UTF-8”。
但是当我在 Mac、开发环境和临时环境上运行代码时,我得到了以下结果: Mac
MacRoman
9498131529
XElaLD8UPzE/P1sWDz8/Pw==
开发人员:
US-ASCII
9498131529
XElaLD8UPzE/P1sWDz8/Pw==
分期
UTF-8
9498131529
XElaLO+/vRTvv70x77+977+9WxYP77+977+977+9
我的配置:
Mac
> sw_vers
ProductName: Mac OS X
ProductVersion: 10.9
BuildVersion: 13A603
开发
> 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 应该是平台无关的。我的假设错了吗?
如果您需要更多详细信息,请告诉我!
最佳答案
为什么要通过字符串进行额外的往返?即使您将“UTF-8”添加到 getBytes() 中,它仍然是错误的,因为它会将原始字节数组(摘要)视为 UTF-8 编码的字符串。
将 hashedBytes 行更改为:
byte hashedBytes[] = digest.digest();
关于java - String.getBytes ("UTF-8")不是平台无关的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20108902/