C# 32位md5加密(解決亂碼和結(jié)果少了一位的問題)

今天在項(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;
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容