哈希又称为散列
哈希算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性。一般用于快速查找和加密算法。
哈希函数
一个简单的哈希函数例子,下面的这个函数参数为:给定的字符串key和长度值,输出结果为0到nTableLength -1的数值,用此函数可以创建长度为nTableLength 的数组,将nTableLength个字符串填充到nTableLength长度的数组中,每个字符串的索引用下面的函数唯一生成。
*注*下面函数问题:没有处理冲突,即两个不同的字符串可能生成相同的哈希值,好的哈希函数会有很好的防冲突处理。比如python中的字典就是用的哈希表实现的,但是不会出现两个key产生相同的哈希值。
unsigned long Hash( const char *key, int nTableLength )
{
unsigned long nHash = 0;
while (*key)
{
nHash = (nHash<<5) + nHash + *key++;
}
return ( nHash % nTableLength );
}
快速查找
上述哈希函数的特性可以看出,可以将任意的二进制东西哈希成数组的index,这样就可以将任意的东西根据哈希值做成数组,然后在需要使用该数据的时候就可以根据哈希值(index)在数组中进行索引即可,这样做成的表称为哈希表,通过事先做好的哈希表,然后通过哈希函数生成哈希值进行查找的速度为O(1),查找非常快速。
缺点:由于哈希值并不是严格的顺序,即可能是1,6,7等跳着的数据,这样会带来空间上的浪费。
经典的哈希算法
MD2、MD4、MD5 和 SHA-1
MD5
MD5使用的哈希函数,将任意的数据生成128位的数据。
用途1:可以用来加密
将很短的密码比如生日,生成128位看不出特殊意义的数据,这样即使数据库被盗,黑客拿到的也只是128位的MD5值。
用途1缺点:如果用一系列生日生成128位数据,然后挨个对比也可以进行暴力破解。
用途1对策:比如网站保存用户密码时,生成MD5密码可以用用户名+密码+特殊字符的形式进行生成MD5,这也是传说中的加salt处理。
用途2:可以进行校验
从远程下载的大数据,在传输过程中可能会发生错误,MD5的任何的不同数据生成的MD5值都是不同的。这样传输前生成的MD5值,在传输后再生成MD5值进行对比即可知道是否有传输错误发生。
SHA-1
SHA-1用途和MD5一样,只不过SHA-1加密生成的数据为160,方法更复杂,相对更安全一些。
<完>