数据结构应用之散列函数

 基本概念

“散列函数”通常我们也叫他“哈希函数”。他相当于一个给某个数据加个指纹的函数。一个数据通过散列函数的作用会有唯一的值与之对应。我们把这个数据叫做“键”,这个“键”通过散列函数作用后的值叫做“值”。

应用场景

1、加密

有些时候我们希望把某些数据加密,加密的目的当然是不希望有人知道我们的原数据只有我们自己知道才好。当然更不希望别人拿到我们的密文后轻易就能破解出我们的明文。于是散列函数就起作用了。我们的明文相当于“键”而密文就是“值”加密的函数就是散列函数。例如我们常用的MD5,他实际上就是一种非对称散列函数,就是说通过我们的键可以知道值,但是通过值求不出键。从数学角度讲就是一个不存在反函数的函数。

举例

比如我们在做网站注册登陆系统时往往对密码进行md5加密后再存入数据库,这样保护了用户的安全性,因为即使有人看到了数据库里的密码也不知道你真正的密码是什么

再比如我们下软件的时候网站通常给我们一个md5值,我们下完后可以根据这个值进行验证,这样防止了软件被恶意窜改或传输过程有误。

2、查找

这是散列的另一个重要应用,想想我们原来的查找一般是基于比对的,也就是一个一个地找,例如在一个数组中找最大值之类的问题,如果排好序的还可以用二分查找一个一个找,总之是要有个过程的这样在数据量特别大的时候是有效率问题的。那么我们为什么不能通过要找的东西直接获得他的位置呢,这就是散列函数的作用了。我们可以用一个数据直接构造他的存储地址add=Hash(data)这样效率会非常高

举例

现在有一种新概念叫NoSql,这种产品很多例如memcachedDB,redis,MongoDB,Cassandra,TokyoCabinet这些花样繁多的Nosql数据库其原理都是基于键值存储(Key/Value)的也就是散列函数,他们之所以有很高的效率是因为他们的数据都是直接定位的,查找的时间是O(1)的。而关系型数据库的查找是很慢的特别在数据量非常大的时候。当然这些产品还有很多其他的技术来保证高的性能和可靠性这里就不讨论了。

再比如在模式识别中,你想识别一个人的脸或某种声音总不能在库里一个一个比对吧,当然会直接利用某种鲁棒性的散列函数来查找数据,这也类似于我们人脑的原理,我们识别一个人的时候肯定不是先把认识的人想一遍然后看看他到底是谁呢?我们总是能一下子就认出来,即使他今天换了个头型我们也能认出来,这就是我们的大脑用了鲁棒性很好的散列函数识别了我们看到的人。

点赞