一。注意要點
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());