数据结构与算法-学习笔记(16)

什么是哈希算法

将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法,获得的二进制值串就是哈希值。 一个hash算法须要知足几点要求:算法

  • 从哈希值不能反向推导出原始数据(因此哈希算法也叫单向哈希算法);
  • 对输入数据很是敏感,哪怕原始数据只修改了一个bit,最后获得的hash值也大不相同;
  • 散列冲突的几率很小,不一样的原始数据,哈希值相同的几率很是小;
  • 哈希算法的执行效率要尽可能高效,针对较长的文本,也能快速的计算出哈希值。

哈希算法的应用

  1. 安全加密
  • MD5(消息摘要算法)、SHA(安全散列)、DES(数据加密标准)、AES(高级加密标准)等。
  • 哈希算法没法作到零冲突(鸽巢原理):哈希值是固定长度的数据串(如MD5:128bit)所以哈希值的数量也是有限的2^128。对于无限的数据进行哈希算法获得有限的哈希值,确定会有冲突的。但如2^128已是个很庞大的数据范围了,想破解很是之难了。
  • 实际开发中选取加密算法,要衡量破解难度和计算时间。
  1. 惟一标识

经过一个较短的二进制串表示一个很大的数据。后端

若是想从海量图库中查找一张图片。由于图片元数据(名称、地点等信息)可能会相同没办法惟一标识一张图片。所以咱们能够从图片的二进制码串(任何文件在计算中均可以表示成二进制码串)前中后三个部位取100B数据,把这300Byte合并经过哈希算法(如MD5)获得一个哈希值做为图片的惟一标识。在根据前边学的查找相关的算法,能够把图片的惟一标识做为key,和相应图片文件在图库中的路径信息都存储在散列表中,在散列表中经过key能够在O(1)下查找到图片。安全

  1. 数据校验 数据在网络中进行传输,颇有可能被恶意修改,致使文件没法打开,甚至致使电脑中毒。如何检测数据是否被篡改呢?哈希算法对数据很敏感,只要数据有一点变化生成的哈希值就会变化,所以能够对数据进行哈希,获得哈希值。当收到文件时,再对文件进行相同哈希函数计算获得哈希值和原始哈希值进行比较,不一样则说明数据被篡改了。服务器

  2. 散列函数 以前的散列函数也是哈希算法的一种应用,只不过它更关注散列后的值是否平均分布,散列函数执行的快慢,所以散列函数通常比较简单,追求效率。网络

对用户密码进行传输如何作更安全呢? 仅对密码进行MD5/SHA加密仍是有很大的可能被攻破,由于有的用户设置的密码太简单(如:654321等)攻击者能够进行字典攻击:字典中存储攻击者可能猜到的各类密码组合和对应加密后的数据串,这样拿到加密后的数据,在字典中查找,极可能就破解了。并发

针对字典攻击,能够引入一个盐,和用户密码组合在一块儿增长密码复杂度,在进行哈希算法加密,这样就提升了破解难度。负载均衡

哈希算法解决分布式问题

  1. 负载均衡 如何把同一个客户端上的全部请求都路由到同一个后端服务器上呢?
  • 最简单的方法:维护一张客户端IP和服务器编号的映射关系表。客户端每次发请求,找到表中对应的服务器编号,请求。可是这种方式有几个弊端:
    • 客户端不少,表会很大,浪费内存空间;
    • 客户端上线下线、服务器扩容缩容都会致使映射关系失效,表的维护成本高。
  • 哈希算法:对客户端的IP地址计算哈希值,再将哈希值与服务器编号列表的大小进行取模,获得的值加上服务器编号起始值就获得了服务器编号。这样就保证了同一个IP最终计算获得的编号值都是同样的(并不须要保证服务器一直都是同一个)。
  1. 数据分片

若是有1T的日志文件,记录了用户的搜索关键字,如何快速统计出每一个关键词被搜索的次数呢?分布式

最开始想到了桶排序,把相同的数据放同一个桶中,最后统计桶中数据个数。但这样就有两个问题:函数

  • 有1T的数据,一块儿取出来计算机内存根本放不下,并且还要为桶开辟空间。
  • 如何把一个数据放到一个桶中呢?经过哪一种映射关系呢?

结合上述问题的到的处理方法:一个计算机放不下,能够用多台计算机并发处理。这样咱们能够把每台计算机看作一个桶。那么如何把数据放到对应的计算机中呢?想到了哈希算法:对每一个数据计算哈希值,而后再根计算机编号列表大小n取模的计算机编号,数据就放到对应编号的计算机中。这样相同数据确定放在同一个计算机中。在每一个计算机在分别计算相同数据出现的次数,最后在合并结果便可。加密

这种思想(MapReduce)结合了桶(数据分片)、哈希算法、散列函数(取模对应列表index)。

若是再1亿张图片中找一张图片,也能够用上述的思想来解决。

针对这种海量数据问题的处理,均可以采用多机分布式处理,借助这种分片思路能够突破单机内存、CPU等资源的限制。

  1. 分布式存储 数据分片时若是增长了一台计算机,那么本来散列函数获得的结果就都失效了,须要所有数据从新计算一次。须要一致性哈希算法。(待补充)
相关文章
相关标签/搜索