频道直达:新闻 - 组网 - 安全 - 服务器 - 存储 - 系统 - 应用 - 开发 - 数据库 - 前沿 - 技术人 - 培训 - 求职 - 读书 - 教程 - 专题 - 产品 - 案例 - 技术圈 - 博客 - BBS
51CTO.COM_中国领先的IT技术网站
找资料:

Visual C# 2005中如何产生与比较哈希值

作者: 章立民 出处:51CTO.com 2007-03-16 17:46    砖    好    评论   进入论坛
阅读提示:System.Security.Cryptography命名空间中的各个类能够让我们非常容易地为初始数据产生一个哈希值(Hash Value)。在此我们将示范如何产生一个哈希值,以及如何比较两个哈希值以便判断它们是否相同。

Visual C# 2005文件 IO与数据存取秘诀》节选

条款33
Visual C# 2005如何实现比较两个文件的内容是否完全相同
条款55
Visual C# 2005如何让ComboBox控件显示出多个数据源属性
条款56
C#中为什么我的ComboBox控件在数据绑定时加载速度很慢
条款63
Visual C# 2005如何连接至Access数据库
条款73
Visual C# 2005中如何为数据表建立自动编号字段
条款100
Visual C# 2005中如何使用数据命令执行Transact-SQL语句
条款134
C#中将DataSet的内容写成XML时如何格式化字段数据
条款152
C#中当用户尝试删除数据行时如何显示确认对话框
条款161
Visual C# 2005中如何以程控方式启动默认的浏览器
条款163
Visual C# 2005中如何产生与比较哈希值
 
借助于System.Security.Cryptography命名空间的密码资源,将非常容易产生与比较哈希值。因为所有的哈希函数都接收类型为 Byte() 的输入,因此可能需要将初始数据转换成一个字节数组才能够为它产生哈希值。欲为一个字符串值建立一个哈希值,请依下列步骤进行:
 
1、使用Using语句导入System、System.Security、System.Security.Cryptographic与System.Text命名空间,这样一来,您才不需要于程序代码中编写一长串的完整名称:
 
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Security.Cryptography;
 
2、声明一个字符串变量来持有您的初始数据,并声明两个字节数组(未定义大小)来持有初始字节与所产生出的哈希值:
 
string sSourceData;
byte[] tmpSource;
byte[] tmpHash;
 
3、使用 GetBytes() 方法(它是System.Text.ASCIIEncoding类的一部分)将您的初始字符串转换至一个字节数组中:
 
sSourceData = "MySourceData";

// 根据初始数据来建立一个字节数组
tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData);
 
4、通过调用MD5CryptoServiceProvider类的实例的ComputeHash方法来为您的初始数据计算出MD5哈希值。请注意,欲计算出另外一个哈希值,您必须建立该类的另外一个实例。
 
// 根据初始数据计算出哈希值
tmpHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource);
 
5、tmpHash字节数组现在会获取您初始数据的哈希值(128位值=16字节)。将此显示或储存成一个十六进制字符串通常会非常有用,下列程序代码即是进行此项处理:
 
lblHashResult.Text = sSourceData + "\n" + ByteArrayToString(tmpHash) + "\n";
 
private string ByteArrayToString(byte[] arrInput)
{
StringBuilder sOutput = new StringBuilder(arrInput.Length);

for (int i = 0; i < arrInput.Length; i++)
{
sOutput.Append(arrInput[i].ToString("X2"));
}

return sOutput.ToString();
}
 
6、通过上述程序代码,您便能够为初始数据产生出哈希值并以一个十六进制字符串来表示。接下来,我
们要继续说明如何比较两个哈希值。
 
为初始数据建立哈希值的目的之一,就是要提供一种方式来检查数据是否被更改过,或是不通过实际的值来比较两个值。不论是哪一种情况,您都需要比较两个哈希值。然而,如果两个哈希值皆已储存成十六进制字符串,则比较哈希值的操作将会更加简易。当然,也有可能两个哈希值都是以字节数组的形式存在。
 
后续步骤的程序代码将延续先前步骤的程序代码,以便示范如何比较两个字节数组。
 
7、请在建立一个十六进制字符串的地方,紧接着根据新的初始数据建立一个新的哈希值:
 
sSourceData = "NotMySourceData";
tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData);
 
byte[] tmpNewHash;
bool bEqual = false;
 
tmpNewHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource);
 
8、比较两个字节数组最直接了当的方式就是通过循环依序处理数组,以便一一比较两数组中的每一个元素。如果有任何元素不相同,或是两数组的大小不相同,则表示两值并不相等:
 
if(tmpNewHash.Length == tmpHash.Length)
{
int i = 0;

while((i < tmpNewHash.Length) & & (tmpNewHash[i] == tmpHash[i]))
{
i += 1;
}
 
 if(i == tmpNewHash.Length)
{
bEqual = true;
}
}

if (bEqual)
{
lblHashResult.Text += "这两个哈希值是相同的";
}
else
{
lblHashResult.Text += "这两个哈希值并不相同";
}
 
9、保存与运行您的项目,以便查看根据第一个哈希值所建立的十六进制字符串,并确认新的哈希值是否
与初始的相同。
 
完整的程序代码已编写在程序范例CH14_DemoForm008.cs的Load事件处理函数中,请自行参考之。图 14-13所示则是执行结果。
图 14-13
 
【责任编辑:火凤凰 TEL:(010)68476606-8007】

关于 哈希    C#
专题
解析35岁技术人的价值与出路
2007盘点专题:有多少盘点值得回味?
C#实用基础教程
网管员值班手册
C#技术开发指南
我也说两句

匿名发表

(如果看不清请点击图片进行更换)


中 国 领 先 的 IT 技 术 网 站 ·
技 术 成 就 梦 想
·Java基础教程 (查看81120次)
·UML类图详解 (查看72587次)
·C++是垃圾语言?! (查看42719次)
·C#技术开发指南 (查看40290次)
·UML统一建模语言 (查看39225次)
·Java编程开发手册 (1198个砖)
·Java基础教程 (431个砖)
·C#技术开发指南 (311个砖)
·.NET开发手册 (254个砖)
·PB开发教程 (223个砖)
·Java编程开发手册 (658个好)
·Java基础教程 (578个好)
·.NET开发手册 (282个好)
·PB开发教程 (213个好)
·Delphi开发技术手册 (200个好)
订阅技术快讯
电子杂志下载
名称:SQL Server数据库管理精品黄皮书
简介:书中文章经过精挑细选,便于用户能根据自己的实际工作和学习,快速在本书寻找到相关资料。内容涵盖了SQL Server的安装与升级、语句查询、数据备份和恢复、自动化任务、数据同步、数据字典、安全和预防、性能和优化、集群等各方面应用信息,以及DBA管理人员在数据库管理工作中
名称:2007路由技术大全
简介:《2007路由技术大全》由51CTO.com网站特别策划制作,该书包括路由器技术、路由器产品、路由器配置、安全设置、路由器故障处理、路由器密码恢复,以及广大网友在实践使用中的心得经验和技巧文章,内容注重实用性,适用于初学者入门,也适合多年从业者提高,是一本实践和理论完
名称:网络安全精品应用黄皮书
简介:《2007精品网络安全黄皮书》包括了9个大类24个小类, 800余篇文章,内容包含了熊猫烧香病毒、DDOS攻击、ARP病等热点问题的介绍及解决方案。从病毒查杀、防范、系统、数据等各方面的安全设置到黑客技术的了解、防范,涉及到了安全应用的全部领域, 由浅至深内容全面。