今天遇到了一个诡异的问题,用类似下面的代码,对不同的字符串区md5时得到的结果竟然一样,
public static void main(String[] args) {
String s1 = DigestUtils.md5DigestAsHex("你好呀".getBytes());
String s2 = DigestUtils.md5DigestAsHex("你好呢".getBytes());
System.out.println(s1);
System.out.println(s2);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
输出
0d1b08c34858921bc7c662b228acb7ba
0d1b08c34858921bc7c662b228acb7ba
- 1
- 2
排查了一下应该是字符串编码的问题,一般linux机器上默认的编码时ISO8859, 导致信息丢失,所以在转byte时指定字符串的编码就好了
public static void main(String[] args) {
//无参getBytes一般使用系统默认编码,如果正好系统是ISO8859,而你又要处理中文,就会出现问题,换成utf8就没问题了
String s1 = DigestUtils.md5DigestAsHex("你好呀".getBytes(StandardCharsets.UTF_8));
String s2 = DigestUtils.md5DigestAsHex("你好呢".getBytes(StandardCharsets.UTF_8));
System.out.println(s1);
System.out.println(s2);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8