计算字符串和文件的MD5值
//计算字符串的MD5值 public string GetMD5(string sDataIn) { MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); byte[] bytValue, bytHash; bytValue = System.Text.Encoding.UTF8.GetBytes(sDataIn); bytHash = md5.ComputeHash(bytValue); md5.Clear(); string sTemp = ""; for (int i = 0; i < bytHash.Length; i++) { sTemp += bytHash[i].ToString("X").PadLeft(2, '0'); } return sTemp.ToLower(); } //计算文件的MD5值 public string MD5Value(string filepath) { MD5 md5 = new MD5CryptoServiceProvider(); byte[] md5ch; using (FileStream fs = File.OpenRead(filepath)) { md5ch = md5.ComputeHash(fs); } md5.Clear(); string strMd5 = ""; for (int i = 0; i < md5ch.Length - 1; i++) { strMd5 += md5ch[i].ToString("x").PadLeft(2, '0'); } return strMd5; }
MD5CryptoServiceProvider继承MD5类,MD5类实现IDisposable接口,应用using
private static string GetMD5FromString(string msg) { //1.创建一个用来计算MD5值的类的对象 using (MD5 md5 = MD5.Create()) { //把字符串转换为byte[] //注意:如果字符串中包含汉字,则这里会把汉字使用utf-8编码转换为byte[],当其他地方 //计算MD5值的时候,如果对汉字使用了不同的编码,则同样的汉字生成的byte[]是不一样的,所以计算出的MD5值也就不一样了。 byte[] msgBuffer = Encoding.Default.GetBytes(msg); //2.计算给定字符串的MD5值 //返回值就是就算后的MD5值,如何把一个长度为16的byte[]数组转换为一个长度为32的字符串:就是把每个byte转成16进制同时保留2位即可。 byte[] md5Buffer = md5.ComputeHash(msgBuffer); //md5.Clear();//释放资源-->using不用释放 StringBuilder sbMd5 = new StringBuilder(); for (int i = 0; i < md5Buffer.Length; i++) { sbMd5.Append(md5Buffer[i].ToString("x2")); } return sbMd5.ToString(); } } private static string GetMD5FromFile(string path) { using (MD5 md5 = MD5.Create()) { using (FileStream fsRead = File.OpenRead(path)) { byte[] bytes = md5.ComputeHash(fsRead); //md5.Clear();//释放资源-->using不用释放 StringBuilder sbMd5 = new StringBuilder(); for (int i = 0; i < bytes.Length; i++) { sbMd5.Append(bytes[i].ToString("X2")); } return sbMd5.ToString(); } } }