数据结构和算法----哈希算法

一、定义

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

二、hash算法编写要求

  1. 从哈希值不能反向推导出原始数据
  2. 对输入数据非常敏感,哪怕原始数据只修改了一个Bit,最后得到的hash值也会变化
  3. 散列冲突的概率很小,对于不同的原始数据,哈希值相同的概率非常小
  4. 哈希算法的执行效率要尽量高效,针对较长的文本,也能尽快的计算出

三、示例

例如’md5信息摘要算法

两个字符串只差了个尾字符,但是结果相差很大。

无论被加密字符长度多少,加密后结果长度都相同

 四、hash算法应用

  1. 安全加密

对于加密算法有两点要求

1、根据哈希值很难反向推导数据

2、散列冲突的概率要很小

目前比较常用的是MD5信息摘要算法,和SHA安全散列算法,据说MD5与SHA-1已经被破解,据我所知MD5的破解并不是反向推导出数据,而是找到散列冲突。理想状态是已知MD5(A)由此构造出B,使MD5(A)=MAD5(B)。但现在做到的是已知A,可以构造信息AB,AC,使得md5(AB)=md5(AC)。现在所有破解md5基本都是用到彩虹对照表,或者碰撞等。

那么为什么哈希算法无法做到零冲突呢!

根据之前学习散列表的知识我们知道,哈希值的长度是固定且有限的,比如MD5

最多能表示2^128个数据,而我们需要转换的值是无穷的。所以第2^128+1个数据求哈希值时,必会与之前的2^128某个数据重复。理论上来说哈希值越长,散列冲突的几率越小。

3、密码存储

前一阵facebook存储了多达6亿个没有加密的用户帐户密码,此消息一出给fecebook弄出很多麻烦。密码以明文的方式存储安全风险会很大。那怎么规避呢,用密文的方式存储。比如MD5加密,当然这也不是万无一失的。那就再增加点难度。给密码加上固定字符再用哈希算法算出哈希值,如果通过就减去固定字符再换另一种哈希算法计算哈希值运算。任何安全加密都不是保证安全的。只不过是在增加破解的成本。如果你能让破解的成本高于数据的价值,那么一定程度上来说你的数据是安全的.

  1. 唯一标识

例如文件监控,读取文件,并将文件进行哈希算法加密。这样就能发现是否新增或者修改过

判断图片是否重复,将每个图片的二进制编码进行哈希算法加密。入库时判断md5是否有重复即可

  1. 数据校验

基于P2P协议下载的数据。(简单介绍下p2p:首先P2P协议是把一个大的文件,按照固定大小进行分片,比如2M一个分片,通过种子中的索引记录每个分片的信息,每个节点互相之间问询,交换已经下载的分片,最后将所有分片组装成原始文件。)那些在网络上的数据有被篡改的危险。我们可以将切片数据通过哈希算法取出哈希值放在种子中。全部下载到本地之后进行校验,因为哈希算法很敏感所以如果文件被修改会和容易发现

  1. 散列函数

散列函数上一篇文章已经说过了,这就不说了

5、负载均衡

想要做到会话粘滞的负载均衡的话(同意客户端,所有会话请求都路由到同一个服务器上),简单的方法就是做个映射表,对应用户ID与服务器编号。这样的方法又两个缺陷,映射表过大的话会占用过多内存空间,不容易维护。

我们可以通过哈希算法,对客户端IP计算哈希值,然后与服务器列表取模,得到的值就是应该路由到的服务器编号。

6、数据分片

唯一标识那段说过的图片重复判断,如果有一亿张图片无法存到一个数据库怎么办,解决办法就是将图片数据分片存储。准备n台服务器,用哈希算法将图片计算哈希值,然后模n,将其存入对应的服务器再判断是否重复。

7、分布式存储

如果用hash算法对数据进行分布式存储是,这样可以很好地做到负载均衡。但是问题来了如果对集群进行扩容时,就需要对之前已经存储的数据重新进行取模运算。比如集群初始状态为五台机器。后来进行扩容后为11台机器,这时候就要对集群内的数据重新的进行运算,以便达到负载均衡的目地。这样就相当于,缓存中的数据一下子就都失效了。所有的数据请求都会穿透缓存,直接去请求数据库。这样就可能发生雪崩效应,压垮数据库。我们用到一致性哈希算法来解决该问题。

一致性哈希算法就是。之前hash算法是对机器个数取模,一致性就是开辟出远大于机器个数的小区间,对这些小区间进行取模运算然后,将小区间平均分配到机器上,每台机器上的小区间的个数为。小区间数量/机器数量。如果扩容时只需间某些小区间内的数据迁移到新的机器中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值