Hash(哈希,散列)
2018-02-08 11:09 Evan 阅读(131) 评论(0) 收藏 举报目录:
- 什么是hash
- hash的用处
- c#中常用的hash算法
- hash表
- hashset
什么是hash:
Hash,一般翻译为散列,或直接音译为“哈希”,就是将任意长度的输入,通过一系列算法,变换成固定长度的输出,该输出就叫做hash(散列)值,该算法就叫做散列函数。 注意:
- 不同的输入可能得到同一散列值,即key1 != key2,但是f(key1) == f(key2)
- 不同的散列值肯定是不同的输入得到的,即f(key1) != f(key2),则key1 != key2
Hash的用处
利用上边提到的特点,hash的应用十分广泛,这里只介绍我们数据加密与数据校验。
数据校验
使用hash值,可以校验数据传输过程中是否被更改过。 具体实现是:在数据的发送方,对将要发送的数据应用散列函数计算hash值,并将计算结果与原始数据一同发送。在数据的接收方,同样的散列函数被再一次应用到接收到的数据上,计算出另外一个hash值,如果两次hash值不一致,就说明数据在传输过程中发生了错误。 有人可能会问,不是“不同的输入通过同一个hash函数也可能产生同一个hash值”吗,这种情况是会发生的,但是从计算机的角度来看,这种情况产生的几率很小。
数据加密
使用hash函数将密码转成hash值可以保证数据的安全性。 例如:我们可以使用hash函数将登陆某系统所需密码转换成hash值保存到数据库中,当用户登陆系统时,系统把用户输入的密码使用同一hash函数计算hash值后与数据库中保存的hash值比较,即可确定密码是否合法。通过这样的步骤,系统在不知道用户密码的明码的情况下就可以确定用户登陆系统的合法性,这样就避免用户的密码被具有系统管理员权限的用户知道,拿到数据库也无法确定用户密码是多少。
C#中常用的hash算法
MD5
MD5算法具有以下特点:
1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
2、容易计算:从原数据计算出MD5值很容易。
3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
4、弱抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
5、强抗碰撞:想找到两个不同的数据,使它们具有相同的MD5值,是非常困难的。
//MD5加密示例代码
public static string CreateMD5Password(string password)
{
var algorithm = HashAlgorithm.Create("MD5");
var hashByteArray = algorithm.ComputeHash(Encoding.UTF8.GetBytes(password));
return Convert.ToBase64String(hashByteArray);
}
SHA1
SHA1被称为MD5的后继者
//SHA1加密示例代码
public static string CreateSHA1Password(string password)
{
var algorithm = HashAlgorithm.Create("SHA1");
var hashByteArray = algorithm.ComputeHash(Encoding.UTF8.GetBytes(password));
return Convert.ToBase64String(hashByteArray);
}
SHA1与MD5的比较:
| MD5 | SHA-1 | |
| 分组长度 | 512bit | 512bit |
| 摘要长度 | 128bit | 160bit |
| 循环步骤 | 64 | 80 |
可以看出MD5要快一些,SHA1要安全一些。
MD5与SHA-1并不是完全安全的
2004年8月17日,在美国加州圣芭芭拉召开的国际密码大会上,山东大学王小云教授在国际会议上首次宣布了她及她的研究小组的研究成果——对MD5、HAVAL-128、MD4和RIPEMD等四个著名密码算法的破译结果。2005年2月宣布破解SHA-1密码。
Hash表
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,加快查找速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(hash)函数。
.Net中有Hashtable类,实现hash表来提高查询速度。详见链接: .Net中的Hash表
hashset
HashSet<T>类主要是设计用来做高性能集运算的,例如对两个集合求交集、并集、差集等。集合中包含一组不重复出现且无特性顺序的元素。详见链接:
扩展阅读
Hashtable、!HashSet与Dictionary的区别:http://www.cnblogs.com/akwwl/p/3680376.html
!HashSet与Dictionary的区别:http://developer.51cto.com/art/201102/244665.htm
浙公网安备 33010602011771号