极客时间课程《数据结构与算法之美》笔记07

哈希算法-如何防止数据库中的用户信息被脱库

定义和原理:将任意长度的二进制值串映射为固定长度的二进制值串

要求:

  • 不能反向推导(单向哈希算法)
  • 对输入数据敏感,哪怕只修改了一个Bit,最后得到的哈希值也大不相同。
  • 散列冲突概率要很小。
  • 执行效率要高,针对较长的文本,也能很快地计算出哈希值。

哈希算法的应用很多,常见有:安全加密、唯一标识、数据校验、散列函数、负载均衡、数据分片、分布式存储

唯一标识

在海量的图片信息中,搜索一张图是否存在。任何文件在计算机中都可以表示成二进制码串,将图片的二进制码串开头、中间、结尾分别取100个字节,然后再通过哈希得到唯一标识。(减轻工作量)

数据校验

BT下载的时候会做数据校验。

散列函数

防范字典攻击引入一个盐(salt),跟用户密码组合在一起,增加密码复杂度,然后用组合后的字符串来做哈希算法加密,将它存储到数据库中,进一步增加破解的难度。
除此之外,一些公司采用的方法:无论密码长度多少,采用计算hash时间都固定或者足够慢的算法,比如:
PBKDF2WithHmacSHA1。避免因计算时间不一样而泄露字符串长度信息。

负载均衡

负载均衡需要维护一个映射表,哈希算法能很方便地维护这个功能,通过客户端IP或者会话ID计算哈希,通过和服务器列表的大小进行取模运算,最终得到服务器编号。

数据分片

统计“搜索关键词”出现的次数,1T的文件日志,记录用户的关键词,快速统计出每个关键词的被搜索次数。
先对数据进行分片,然后采用多台机器处理的方法,提升速度。关键词计算哈希,跟n取模,最终得到机器编号。同一个关键词会被分配在同一个机器上。
这个处理过程也是MapReduce的基本设计思想

分布式存储

原本10台服务器,增加到12台。原有哈希可能失效,重新计算缓存产生雪崩效应。
一致性哈希算法:假设有K台机器,将整个范围划分成m个小区间(m远大于k)

原文地址:https://www.cnblogs.com/JackKing-defier/p/11288971.html