一。注意要点
1:输入字符串的的编码双方保持统一,如:UTF8;
2:HASH计算输出结果 byte[] 数组转String 时,编码要统一,如:转16进制小写字符串。当然也可以转Base64。
3:如果是16进制字符串,双方大小写要统一。
二。C#
先看一个常见代码:
public static String Md5Hash(String str) { MD5 md = MD5.Create(); byte[] bytes = Encoding.UTF8.GetBytes(str); byte[] buffer2 = md.ComputeHash(bytes); string rst = ""; //小写的 x2 是16进制小写。大写 X2 是转16进制大写。 for (int i = 0; i < buffer2.Length; i++) { rst = rst + buffer2[i].ToString("x2"); } return rst; }
解析:
“MD5 md = MD5.Create();” 获取一个C# MD5对象。
“byte[] bytes = Encoding.UTF8.GetBytes(str);”,将输入字符串用UTF8编码转为byte[] 数组,方便下一步给ComputeHash()方法计算。
“rst = rst + buffer2[i].ToString("x2");”,拿到HASH结果后,逐字节转16进制小写。
调用这个方法:
string strOrg = "*"; Console.WriteLine("md5 hash 16进制小写:"+ Md5Hash(strOrg));
看下结果:
md5 hash 16进制小写:025fceab9418be86066b60a71bc71485
我们也可以将"x2"换成大写的“X2”,这样转出来16进制字符串为大写。
public static String Md5HashUpper(String str) { MD5 md = MD5.Create(); byte[] bytes = Encoding.UTF8.GetBytes(str); byte[] buffer2 = md.ComputeHash(bytes); string rst = ""; //小写的 x2 是16进制小写。大写 X2 是转16进制大写。 for (int i = 0; i < buffer2.Length; i++) { rst = rst + buffer2[i].ToString("X2"); } return rst; }
调用:
Console.WriteLine("md5 hash 16进制大写:" + Md5HashUpper(strOrg));
结果 :
md5 hash 16进制大写:025FCEAB9418BE86066B60A71BC71485
还有另一个方法,可把byte[] 转为16进制:BitConverter.ToString().
要注意,BitConverter.ToString(),转出来的16进制字符串,是带减号的“-”,返回最终结果时要去掉-。
public static String Md5HashBitConvert(String str) { MD5 md = MD5.Create(); byte[] bytes = Encoding.UTF8.GetBytes(str); byte[] buffer2 = md.ComputeHash(bytes); string rst = BitConverter.ToString(buffer2); Console.WriteLine("BitConverter.ToString()之后原始值:" + rst); string rst2 = rst.Replace("-", ""); Console.WriteLine("去掉减号‘-’后值:" + rst2); return rst2; }
运算结果:
BitConverter.ToString()之后原始值:02-5F-CE-AB-94-18-BE-86-06-6B-60-A7-1B-C7-14-85
去掉减号‘-’后值:025FCEAB9418BE86066B60A71BC71485
三。JAVA
package org.example; import java.security.MessageDigest; public class HashUtil { public static String Md5Hash(String str) throws Exception { //默认UTF8 byte[] byStr=str.getBytes(); String rst=""; // MessageDigest instance for MD5 MessageDigest md = MessageDigest.getInstance("MD5"); // Update MessageDigest with input text in bytes md.update(byStr); // Get the hashbytes byte[] hashBytes = md.digest(); // Convert hash bytes to hex format StringBuilder sc = new StringBuilder(); //小写的 x 是转16进制小写。 for (byte b : hashBytes) { sc.append(String.format("%02x", b)); } rst=sc.toString(); return rst; } public static String Md5HashUpper(String str) throws Exception { //默认UTF8 byte[] byStr=str.getBytes(); String rst=""; // MessageDigest instance for MD5 MessageDigest md = MessageDigest.getInstance("MD5"); // Update MessageDigest with input text in bytes md.update(byStr); // Get the hashbytes byte[] hashBytes = md.digest(); // Convert hash bytes to hex format StringBuilder sc = new StringBuilder(); //小写的 x 是转16进制小写。大写的 X 转为大写。 for (byte b : hashBytes) { sc.append(String.format("%02X", b)); } rst=sc.toString(); return rst; } }
调用:
public static void main( String[] args ) { try { String md5HashInput="*"; System.out.println( "MD5 HASH输入:" +md5HashInput); String md5HashOutput=HashUtil.Md5HashUpper(md5HashInput); System.out.println( "MD5 HASH输出:" +md5HashOutput); }catch (Exception ex) { System.out.println( "ex:"+ex.getMessage() ); } System.out.println( "Hello ee!" ); } }
运算结果:
MD5 HASH输入:*
MD5 HASH输出:025FCEAB9418BE86066B60A71BC71485
没必要为了大小单独写一个方法,直接在 Md5Hash(strOrg) 方法后面加 ToUpper(),这里只是为了方便演示。
Console.WriteLine("md5 hash 16进制大写2 :" + Md5Hash(strOrg).ToUpper());