数据结构和算法之美 —— 哈希算法

数据结构和算法之美 - 21

数据结构和算法之美 - 22 (哈希算法的三种应用:负载均衡、数据分片、分布式存储)

哈希算法的定义:将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。

常用哈希算法:比如 MD5、SHA 等

哈希算法几点要求:

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

常见的哈希算法的应用:

  1. 安全加密、(依赖特性:不能反向推到,冲突概率小)
  2. 唯一标识、(对大数据做信息摘要,通过一个较短的二进制编码来表示很大的数据。)
  3. 数据校验、(依赖特性:对于输入数据非常敏感)
  4. 散列函数、
  5. 负载均衡、
  6. 数据分片、
  7. 分布式存储

数据校验的场景:哈希算法有一个特点,对数据很敏感。只要文件块的内容有一丁点儿的改变,最后计算出的哈希值就会完全不同。所以,当文件块下载完成之后,我们可以通过相同的哈希算法,对下载好的文件块逐一求哈希值,然后跟种子文件中保存的哈希值比对。如果不同,说明这个文件块不完整或者被篡改了,需要再重新从其他宿主机器上下载这个文件块。

负载均衡的场景:同一个客户端上,在一次会话中的所有请求都路由到同一个服务器上。通过哈希算法,对客户端 IP 地址或者会话 ID 计算哈希值,将取得的哈希值与服务器列表的大小进行取模运算,最终得到的值就是应该被路由到的服务器编号。优点:无需消耗内存维护客户端和服务器对应的映射表,取模的运算可以很好地兼容服务器扩容和缩容。

数据分片的场景:统计大数据量搜索关键词的次数,同一个搜索关键词会被分配到同一个机器上。每个机器会分别计算关键词出现的次数,最后合并起来就是最终的结果。

分布式存储的场景:海量的数据存储在多台机器上。通过哈希算法对数据取哈希值,然后对机器个数取模,这个最终值就是应该存储的缓存机器编号。缺点:机器进行扩容,前面的取模运算就需要重新计算,因此所有的数据都要重新计算哈希值,然后重新搬移到正确的机器上。这样就相当于,缓存中的数据一下子就都失效了,可能造成 雪崩效应,压垮数据库。爲了解決这个对于扩容造成问题,提出了 一致性哈希算法 : 假设我们有 k 个机器,数据的哈希值的范围是[0, MAX]。我们将整个范围划分成 m 个小区间(m 远大于 k),每个机器负责 m/k 个小区间。当有新机器加入的时候,就将某几个小区间的数据,从原来的机器中搬移到新的机器中。这样,既不用全部重新哈希、搬移数据,也保持了各个机器上数据数量的均衡。

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值