哈希函数特点
1.∞个in对应 有限个out
2.相同in对应相同out
3.不同in也可以对应相同out (哈希碰撞)
**4.out等概率且随机
Hash(in)%m=out 哈希后取余
Q1:实现一种结构,可增删取的时间复杂度都为O1
增:将某个key加到结构中,不重复加入
删:将某个key在结构中删去
取:等概率随机返回一个key
两个哈希map维护(value,key)(key,value)一个变量size维护数据个数。
map1(A,0)(B,1)(C,2)..map2(0,A)(1,B)(2,C) size=3
map2用于随机查找,map1用于快速定位删除,删除时为保证虚拟下标0-2连续,用最末元素代替要删除的元素,size减1。即删除B时C代替B位置(C,1) (1,C)。
Q2:40e数据中取出现次数最多的10个数
用哈希函数Hash(in)%m的取余结果作为分文件的依据,每个文件维护一个map(key,num),返回每个文件前10个数,再统计即可。
平均划分不可取,因为会导致相同的数处于不同文件之中。
Q3:布隆过滤器
实现黑名单/爬虫不重复,只增不删,大量数据中快速返回结果,允许有误差。
用位图表示信息
以int数组A构造bit数组为例子
低位开始4321 8765小端存放
i位处于 numIndex=i/32; bitIndex=i%32
获取位数数据:Bit=A[numIndex]>>bitIndex&1
改1:A[numIndex]=A[numIndex]|1<<bitIndex;使修改位为1,其余为0
改0:A[numIndex]=A[numIndex]&(~ 1<<bitIndex);使修改位为0取余为1
黑名单/url分别使用k个哈希函数,映射到长度为m的位图上,将哈希结果的位数改为1。
检查时与构建时一样操作,当哈希结果所表示的位全为1时,该用户处黑名单中,可能存在哈希碰撞,使白名单误判,但不会使黑变白。
Q4:一致性哈希
数据库分为逻辑层和数据层,数据层是实际存放层,逻辑层从数据层获取数据返回用户。
一致性哈希用于数据层。
朴素版本:数据通过哈希取余来选择归属的数据服务器,不增不减时可实现负载均衡,当出现删减服务器时,迁移代价过大,需所有数据重新计数归属数据服务器。
优化版本:哈希环。通过计算n台服务器的唯一标识如ip的哈希,将环划分为n段,数据按顺时针方向选择归属的服务器,落在第n段归属n服务器。缺点在于服务器数目较小时不能实现负载均衡。增减服务器只重新计算所处段原归属的服务器即可。
虚拟节点优化哈希环实现负载均衡。如给3台服务器分配1k个字符串,在这1k个字符串上面作哈希,此时哈希环上有平均分布3k个虚拟节点,三台服务器可均衡存储数据。新增只需给新服务器分配1k个字符串加入到哈希环中再计算小量服务器数据重新归属即可,删除则将服务器所拥有的字符串按照哈希环位置分配给其他服务器。
虚拟节点可以实现管理负载,给分配的字符串数量代表着负载能力,串越多,负载越高。