将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法,获得的二进制值串就是哈希值。 一个hash算法须要知足几点要求:算法
经过一个较短的二进制串表示一个很大的数据。后端
若是想从海量图库中查找一张图片。由于图片元数据(名称、地点等信息)可能会相同没办法惟一标识一张图片。所以咱们能够从图片的二进制码串(任何文件在计算中均可以表示成二进制码串)前中后三个部位取100B数据,把这300Byte合并经过哈希算法(如MD5)获得一个哈希值做为图片的惟一标识。在根据前边学的查找相关的算法,能够把图片的惟一标识做为key,和相应图片文件在图库中的路径信息都存储在散列表中,在散列表中经过key能够在O(1)下查找到图片。安全
数据校验 数据在网络中进行传输,颇有可能被恶意修改,致使文件没法打开,甚至致使电脑中毒。如何检测数据是否被篡改呢?哈希算法对数据很敏感,只要数据有一点变化生成的哈希值就会变化,所以能够对数据进行哈希,获得哈希值。当收到文件时,再对文件进行相同哈希函数计算获得哈希值和原始哈希值进行比较,不一样则说明数据被篡改了。服务器
散列函数 以前的散列函数也是哈希算法的一种应用,只不过它更关注散列后的值是否平均分布,散列函数执行的快慢,所以散列函数通常比较简单,追求效率。网络
对用户密码进行传输如何作更安全呢? 仅对密码进行MD5/SHA加密仍是有很大的可能被攻破,由于有的用户设置的密码太简单(如:654321等)攻击者能够进行字典攻击:字典中存储攻击者可能猜到的各类密码组合和对应加密后的数据串,这样拿到加密后的数据,在字典中查找,极可能就破解了。并发
针对字典攻击,能够引入一个盐,和用户密码组合在一块儿增长密码复杂度,在进行哈希算法加密,这样就提升了破解难度。负载均衡
若是有1T的日志文件,记录了用户的搜索关键字,如何快速统计出每一个关键词被搜索的次数呢?分布式
最开始想到了桶排序,把相同的数据放同一个桶中,最后统计桶中数据个数。但这样就有两个问题:函数
结合上述问题的到的处理方法:一个计算机放不下,能够用多台计算机并发处理。这样咱们能够把每台计算机看作一个桶。那么如何把数据放到对应的计算机中呢?想到了哈希算法:对每一个数据计算哈希值,而后再根计算机编号列表大小n取模的计算机编号,数据就放到对应编号的计算机中。这样相同数据确定放在同一个计算机中。在每一个计算机在分别计算相同数据出现的次数,最后在合并结果便可。加密
若是再1亿张图片中找一张图片,也能够用上述的思想来解决。
针对这种海量数据问题的处理,均可以采用多机分布式处理,借助这种分片思路能够突破单机内存、CPU等资源的限制。