MD5算法【计算文件和字符串的MD5值】
2015-08-04 18:02
411 查看
1. MD5算法是一种散列(hash)算法(摘要算法,指纹算法),不是一种加密算法(易错)。任何长度的任意内容都可以用MD5计算出散列值。MD5的前身:MD2、MD3、MD4。介绍工具:CalcMD5.zip。主要作用就是【验明"真身"】,字符串文件均可(确保信息传输过程中的完整性、一致性)。
2. MD5算法的特点:
1. 长度固定
2. 单向性 ---- 可以通过MD5计算器来计算文件或者字符串的MD5值,但是不可以通过给出的MD5值来推算出文件或者字符串。
3. 抗冲突性(不重复)
4. "雪崩效应",只要源发生一点变化,就会造成大的变化
5. 不同的"源",生成的MD5值总是不一样的,相同的"源",产生的总是相同的MD5值。
6. 同样的内容,每次生成的MD5值是一样的。
3. 代码实现【计算文件和字符串的MD5值】
·计算字符串的MD5值:
///
<summary>
///
计算字符串的MD5值
///
</summary>
///
<param name="msg"></param>
///
<returns></returns>
privatestaticstringGetMD5FromString(stringmsg)
{
//1.创建一个用来计算MD5值的类对象
using (MD5md5=MD5.Create())
{
//把字符串转换为byte[]数组
//注意:如果字符串中包含汉字,则这里会把汉字使用utf-8编码转换为byte[],当其他地方计算MD5值的时候,如果对汉字使用了不同的编码,则同样的汉字生成的byte[]是不一样的,所以计算出的MD5值也就不一样了。
//byte[] msgBuffer = Encoding.Default.GetBytes(msg); 使用系统默认的编码
byte[] msgBuffer=Encoding.UTF8.GetBytes(msg);
//2. 计算给定的字符串的MD5值
//返回值就是计算后的MD5值,如何把一个长度为16的byte[]数组转化为一个长度为32的字符串:就是把一个byte转成16进制同时保留2位即可。
byte[] md5Buffer=md5.ComputeHash(msgBuffer);
md5.Clear();//释放资源
StringBuildersbMd5=newStringBuilder();
for (inti=0; i<md5Buffer.Length; i++)
{
//以16进制输出,并保留2位
sbMd5.Append(md5Buffer[i].ToString("x2"));
}
returnsbMd5.ToString();
}
}
///
<summary>
///
计算文件的MD5值
///
</summary>
///
<param name="path"></param>
///
<returns></returns>
privatestaticstringGetMD5FromFile(stringpath)
{
using (MD5md5=MD5.Create())
{
using (FileStreamfsRead=File.OpenRead(path))
{
byte[] bytes=md5.ComputeHash(fsRead);
md5.Clear();
StringBuildersbMd5=newStringBuilder();
for (inti=0; i<bytes.Length; i++)
{
sbMd5.Append(bytes[i].ToString("x2"));
}
returnsbMd5.ToString();
}
}
}
2. MD5算法的特点:
1. 长度固定
2. 单向性 ---- 可以通过MD5计算器来计算文件或者字符串的MD5值,但是不可以通过给出的MD5值来推算出文件或者字符串。
3. 抗冲突性(不重复)
4. "雪崩效应",只要源发生一点变化,就会造成大的变化
5. 不同的"源",生成的MD5值总是不一样的,相同的"源",产生的总是相同的MD5值。
6. 同样的内容,每次生成的MD5值是一样的。
3. 代码实现【计算文件和字符串的MD5值】
·计算字符串的MD5值:
///
<summary>
///
计算字符串的MD5值
///
</summary>
///
<param name="msg"></param>
///
<returns></returns>
privatestaticstringGetMD5FromString(stringmsg)
{
//1.创建一个用来计算MD5值的类对象
using (MD5md5=MD5.Create())
{
//把字符串转换为byte[]数组
//注意:如果字符串中包含汉字,则这里会把汉字使用utf-8编码转换为byte[],当其他地方计算MD5值的时候,如果对汉字使用了不同的编码,则同样的汉字生成的byte[]是不一样的,所以计算出的MD5值也就不一样了。
//byte[] msgBuffer = Encoding.Default.GetBytes(msg); 使用系统默认的编码
byte[] msgBuffer=Encoding.UTF8.GetBytes(msg);
//2. 计算给定的字符串的MD5值
//返回值就是计算后的MD5值,如何把一个长度为16的byte[]数组转化为一个长度为32的字符串:就是把一个byte转成16进制同时保留2位即可。
byte[] md5Buffer=md5.ComputeHash(msgBuffer);
md5.Clear();//释放资源
StringBuildersbMd5=newStringBuilder();
for (inti=0; i<md5Buffer.Length; i++)
{
//以16进制输出,并保留2位
sbMd5.Append(md5Buffer[i].ToString("x2"));
}
returnsbMd5.ToString();
}
}
///
<summary>
///
计算文件的MD5值
///
</summary>
///
<param name="path"></param>
///
<returns></returns>
privatestaticstringGetMD5FromFile(stringpath)
{
using (MD5md5=MD5.Create())
{
using (FileStreamfsRead=File.OpenRead(path))
{
byte[] bytes=md5.ComputeHash(fsRead);
md5.Clear();
StringBuildersbMd5=newStringBuilder();
for (inti=0; i<bytes.Length; i++)
{
sbMd5.Append(bytes[i].ToString("x2"));
}
returnsbMd5.ToString();
}
}
}
相关文章推荐
- 【暑假】[基本数据结构]基本的数据结构知识点总结梳理
- 黑马程序员----IO基础知识1
- 【微信支付】开发遇到的一些问题一些弯路
- Hdu 1029 Ignatius and the Princess IV
- 【微信支付】开发遇到的一些问题一些弯路
- 82 Remove Duplicates from Sorted List II
- 【android自定义控件】android ListView添加侧滑删除
- 浅析Android下的Android.mk文件
- 内存管理-智能指针
- Ubuntu server下搭建Maven私服Nexus
- 正则表达式(Regular Express)学习笔记
- CentOS设置程序开机自启动的方法
- more detail pxe deploy in ironic
- JSONArray json = JSONArray.fromObject(list_excel); list类型数据转换成JSONArray类型数据报错
- iOS开发之地图-----01定位CoreLocation
- NYOJ58:最少步数【深搜】
- CSRF的攻击与防御学习笔记(二)
- 浅谈如何选择短信服务
- 用AngularJS开发下一代应用(学习笔记)
- <jsp:include page= 与 <jsp:param