哈希算法

哈希算法算法

哈希算法

什么是哈希算法

  • 从哈希值不能反向推导出原始数据(因此哈希算法也叫单向哈希算法)数据库

  • 对输入数据很是敏感,哪怕原始数据只修改了一个Bit,最后获得的哈希值也大不相同后端

  • 散列冲突的几率要很小,对于不一样的原始数据,哈希值相同的几率很是小缓存

  • 哈希算法的执行效率要尽可能高效,针对较长的文本,也能快速地计算出哈希值。安全

哈希算法的应用

应用一:安全加密

说到哈希算法的应用,最早想到的应该就是安全加密。最经常使用于加密的哈希算法是MD5(MD5 Message-Digest Algorithm,MD5消息摘要算法)和SHA(Secure Hash Algorithm,安全散列算法)。服务器

对用于加密的哈希算法来讲,有两点格外重要。第一点是很难根据哈希值反向推导出原始数据,第二点是散列冲突的几率要很小。session

第一点很好理解,加密的目的就是防止原始数据泄露,因此很难经过哈希值反向推导原始数据,这是一个最基本的要求。因此我着重讲一下第二点。实际上,不论是什么哈希算法,咱们只能尽可能减小碰撞冲突的几率,理论上是没办法作到彻底不冲突的。负载均衡

没有绝对安全的加密。越复杂、越难破解的加密算法,须要的计算时间也越长。好比SHA-256比SHA-1要更复杂、更安全,相应的计算时间就会比较长。密码学界也一直致力于找到一种快速而且很难被破解的哈希算法。咱们在实际的开发过程当中,也须要权衡破解难度和计算时间,来决定究竟使用哪一种加密算法。分布式

应用二:惟一标识

咱们能够给每个图片取一个惟一标识,或者说信息摘要。好比,咱们能够从图片的二进制码串开头取100个字节,从中间取100个字节,从最后再取100个字节,而后将这300个字节放到一块,经过哈希算法(好比MD5),获得一个哈希字符串,用它做为图片的惟一标识。经过这个惟一标识来断定图片是否在图库中,这样就能够减小不少工做量。函数

若是还想继续提升效率,咱们能够把每一个图片的惟一标识,和相应的图片文件在图库中的路径信息,都存储在散列表中。当要查看某个图片是否是在图库中的时候,咱们先经过哈希算法对这个图片取惟一标识,而后在散列表中查找是否存在这个惟一标识。

应用三:数据校验

咱们经过哈希算法,对100个文件块分别取哈希值,而且保存在种子文件中。咱们在前面讲过,哈希算法有一个特色,对数据很敏感。只要文件块的内容有一丁点儿的改变,最后计算出的哈希值就会彻底不一样。因此,当文件块下载完成以后,咱们能够经过相同的哈希算法,对下载好的文件块逐一求哈希值,而后跟种子文件中保存的哈希值比对。若是不一样,说明这个文件块不完整或者被篡改了,须要再从新从其余宿主机器上下载这个文件块。

应用四:负载均衡

咱们知道,负载均衡算法有不少,好比轮询、随机、加权轮询等。那如何才能实现一个会话粘滞(session sticky)的负载均衡算法呢?也就是说,咱们须要在同一个客户端上,在一次会话中的全部请求都路由到同一个服务器上。

最直接的方法就是,维护一张映射关系表,这张表的内容是客户端IP地址或者会话ID与服务器编号的映射关系。客户端发出的每次请求,都要先在映射表中查找应该路由到的服务器编号,而后再请求编号对应的服务器。

若是借助哈希算法,这些问题均可以很是完美地解决。咱们能够经过哈希算法,对客户端IP地址或者会话ID计算哈希值,将取得的哈希值与服务器列表的大小进行取模运算,最终获得的值就是应该被路由到的服务器编号。 这样,咱们就能够把同一个IP过来的全部请求,都路由到同一个后端服务器上。

应用五:数据分片

假如咱们有1T的日志文件,这里面记录了用户的搜索关键词,咱们想要快速统计出每一个关键词被搜索的次数,该怎么作呢?

咱们来分析一下。这个问题有两个难点,第一个是搜索日志很大,没办法放到一台机器的内存中。第二个难点是,若是只用一台机器来处理这么巨大的数据,处理时间会很长。

针对这两个难点,咱们能够先对数据进行分片,而后采用多台机器处理的方法,来提升处理速度。具体的思路是这样的:为了提升处理的速度,咱们用n台机器并行处理。咱们从搜索记录的日志文件中,依次读出每一个搜索关键词,而且经过哈希函数计算哈希值,而后再跟n取模,最终获得的值,就是应该被分配到的机器编号。

这样,哈希值相同的搜索关键词就被分配到了同一个机器上。也就是说,同一个搜索关键词会被分配到同一个机器上。每一个机器会分别计算关键词出现的次数,最后合并起来就是最终的结果。

实际上,这里的处理过程也是MapReduce的基本设计思想,针对这种海量数据的处理问题,咱们均可以采用多机分布式处理。借助这种分片的思路,能够突破单机内存、CPU等资源的限制。。

应用六:分布式存储

在数据增长须要扩充机器时:原来的数据是经过与10来取模的。好比13这个数据,存储在编号为3这台机器上。可是新加了一台机器中,咱们对数据按照11取模,原来13这个数据就被分配到2号这台机器上了。

  

所以,全部的数据都要从新计算哈希值,而后从新搬移到正确的机器上。这样就至关于,缓存中的数据一会儿就都失效了。全部的数据请求都会穿透缓存,直接去请求数据库。这样就可能发生雪崩效应,压垮数据库。

因此,咱们须要一种方法,使得在新加入一个机器后,并不须要作大量的数据搬移。这时候,一致性哈希算法就要登场了。

假设咱们有k个机器,数据的哈希值的范围是[0, MAX]。咱们将整个范围划分红m个小区间(m远大于k),每一个机器负责m/k个小区间。当有新机器加入的时候,咱们就将某几个小区间的数据,从原来的机器中搬移到新的机器中。这样,既不用所有从新哈希、搬移数据,也保持了各个机器上数据数量的均衡。

相关文章
相关标签/搜索