Hi~ o(  ̄▽ ̄)ブ
本篇博客分为上下两部分,上半部分主要讲解哈希表的基础知识,下半部分主要是功能代码实现。 φ(≧ω≦*)♪
什么是哈希表
哈希,就是把任意长度的输入通过散列算法变换成固定长度的输出。
哈希表,是根据关键码值(Key value)而直接进行访问的数据结构。
通俗理解的说,就是通过一个函数算法,把需要存储的东西经过这个算法转化成一个更简单的东西(关键码值),然后将这个关键码值作为所存储东西的地址,直接通过地址进行查找,简化了查找算法。
给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。
既然哈希表的核心,就是一个函数,那么,我们就可以通过研究函数的性质来研究哈希表。
︿( ̄︶ ̄)︿
不可逆性
首先来看一个简单的函数:
f(key)=a+b
假如有两个密码3和4,我的加密算法很简单就是3+4,结果是7,
但是通过7我不可能确定那两个密码是3和4,因为有很多种组合。
除非暴力破解。 Σ( ° △ °|||)︴
这就是哈希算法的不可逆性
既然提到了密码,我们就举一个哈希算法在密码学中的应用。
我们登陆知乎的时候都需要输入密码,那么知乎如果明文保存这个密码,那么黑客就很容易窃取大家的密码来登陆,特别不安全。那么知乎就想到了一个方法,使用hash算法生成一个密码的签名,知乎后台只保存这个签名值。由于hash算法是不可逆的,那么黑客即便得到这个签名,也很难计算出原始密码,丝毫没有用处;而如果你在网站登陆界面上输入你的密码,那么知乎后台就会根据加密算法重新计算一下这个hash值,与网站中储存的原hash值进行比对,如果相同,证明你拥有这个账户的密码,那么就会允许你登陆。银行也是如此,银行是万万不敢保存用户密码的原文的,只会保存密码的hash值而已。
“碰撞”现象
那么我们知道,函数一定是映射,但不一定是一一映射,一一映射是一对一的关系 。
函数 eg:y=x^2
x一定唯一对应y值,但y值可能对应多个x值。
同理,对不同的关键字可能得到同一散列地址ÿ