哈希算法

如何防止数据库中的用户信息被脱库?

MD5、SHA

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

MD5的哈希值是128位的bit长度

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

应用一:安全加密

MD5(MD5消息摘要算法)和SHA(安全散列算法)

应用二:唯一标识

海量图库中,搜索一张图是否存在。

应用三:数据校验

基于P2P协议的BT下载软件,校验文件块的安全、正确、完整

应用四:散列函数

 

哈希算法在分布式系统中有哪些应用

应用五:负载均衡

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

可以通过哈希算法,对客户端 IP 地址或者会话 ID 计算哈希值,将取得的哈希值与服务器列表的大小进行取模运算,最终得到的值就是应该被路由到的服务器编号。 这样,就可以把同一个IP过来的所有请求,都路由到同一个后端服务器上。

应用六:数据分片

1.如何统计“搜索关键词”出现的次数?

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

第一个是搜索日志很大,没办法放到一台机器的内存中。第二个难点是,如果只用一台机器来处理这么巨大的数据,处理时间会很长。

可以先对数据进行分片,然后采用多台机器处理的方法,来提高处理速度。

具体的思路是这样的:为了提高处理的速度,用 n 台机器并行处理。从搜索记录的日志文件中,依次读出每个搜索关键词,并且通过哈希函数计算哈希值,然后再跟 n 取模,最终得到的值,就是应该被分配到的机器编号。

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

2.如何快速判断图片是否在图库中?

给每个图片取唯一标识(或者信息摘要),然后构建散列表。1亿张图片。

散列表中每个数据单元包括哈希值和图片文件路径两个信息

针对这种海量数据的处理问题,都可以采用多机分布式处理。借助这种分片的思路,可以突破单机内存、CPU 等资源的限制。

应用七:分布式存储

分布式缓存,将数据分布到多台机器上,利用分片思想

但存在问题:

扩容时所有数据都要重新计算哈希值,然后搬移到正确的机器上。这样就相当于,缓存中的数据一下子就都失效了。所有的数据请求都会穿透缓存,直接去请求数据库。这样就可能发生雪崩效应,压垮数据库。

解决方案:

一致性哈希         很多分布式存储系统中都会用到

其他应用:CRC校验、Git commit id等

 

posted @ 2020-03-31 22:14  LinBupt  阅读(575)  评论(0编辑  收藏  举报