今天在項(xiàng)目中用到32位的小寫的md5加密 然后在網(wǎng)上搜了一下 有好多,直接就復(fù)制用了,最后得出的結(jié)果居然少了一位,我勒個(gè)擦,然后又找了幾個(gè),最后發(fā)現(xiàn)
public static string GetMD5(string str)
{
byte[] b = System.Text.Encoding.Default.GetBytes(str);
b = new System.Security.Cryptography.MD5CryptoServiceProvider().ComputeHash(b);
string ret = "";
for (int i = 0; i < b.Length; i++)
{
ret += b[i].ToString("x").PadLeft(2, '0');
}
return ret;
}
這種在傳入?yún)?shù)有中文時(shí)會(huì)出現(xiàn)問題,經(jīng)過排查返現(xiàn)Encoding.Default使用的是默認(rèn)的編碼:gb2312
所以有下一個(gè)版本
public static string UserMd5(string str)
{
string cl = str;
string pwd = "";
MD5 md5 = MD5.Create();//實(shí)例化一個(gè)md5對(duì)像
// 加密后是一個(gè)字節(jié)類型的數(shù)組,這里要注意編碼UTF8/Unicode等的選擇
byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(cl));
// 通過使用循環(huán),將字節(jié)類型的數(shù)組轉(zhuǎn)換為字符串,此字符串是常規(guī)字符格式化所得
for (int i = 0; i < s.Length; i++)
{
// 將得到的字符串使用十六進(jìn)制類型格式。格式后的字符是小寫的字母,如果使用大寫(X)則格式后的字符是大寫字符
pwd = pwd + s[i].ToString("x");
}
return pwd;
}
這種就是得出結(jié)果會(huì)少一位的,后來分析發(fā)現(xiàn)是 字符串格式符的問題, X 表示大寫, x 表示小寫, X2和x2表示不省略首位為0的十六進(jìn)制數(shù)字;
比如:ox0A, 使用X== 0xA, 使用X2==0x0A
最終版:
public static string UserMd5(string str)
{
string cl = str;
string pwd = "";
MD5 md5 = MD5.Create();//實(shí)例化一個(gè)md5對(duì)像
// 加密后是一個(gè)字節(jié)類型的數(shù)組,這里要注意編碼UTF8/Unicode等的選擇
byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(cl));
// 通過使用循環(huán),將字節(jié)類型的數(shù)組轉(zhuǎn)換為字符串,此字符串是常規(guī)字符格式化所得
for (int i = 0; i < s.Length; i++)
{
// 將得到的字符串使用十六進(jìn)制類型格式。格式后的字符是小寫的字母,如果使用大寫(X)則格式后的字符是大寫字符
pwd = pwd + s[i].ToString("x2");
}
return pwd;
}