数据结构与算法-学习笔记(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. 分布式存储 数据分片时如果增加了一台计算机,那么原本散列函数得到的结果就都失效了,需要全部数据重新计算一次。需要一致性哈希算法。(待补充)

转载于:https://juejin.im/post/5c05f73ff265da61776bbc01

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值