目录
哈希函数
输入域有限,输出域无穷 MP5:输出0~2^64-1 SHal:输出0~2^128-1 相同输入返回相同输出,不同输入可能有相同输出(哈希碰撞) 离散性:输出没规律 均匀性:输出均匀分布
1GB为10亿多B(2^30)
有40亿个数,用1GB内存挑出最大的数字:
直接用哈希表内存会爆掉,可以先用哈希函数计算后%m,把所有的数分为m个小文件,再用哈希表统计每一个小文件中的数,统计完一个就释放掉,最后返回出现最多的数。
位图
开一个int类型的数组,每一个值都为4字节32比特,看成位的数组,10个int类型就为320个比特类型数组
布隆过滤器(适用于add、select)
开一个空间m(bit)长度的位图,加入黑名单时,经过k个哈希函数算出k个位置描黑。查询的时候经过k个哈希函数计算出的k个位置如果都黑就认为添加过。可能会把白的变黑的。
n = 样本量 p = 失误率
m = -(n*lnp)/(ln2)^2 (除8) 理论
k = ln2 * m/n 约等于 0.7 * m/n 理论
p = ( 1 - e^(-n*k/m) )^k 真实
一致性哈希
分布式数据库的负载均衡问题:
经典结构:算完数据的哈希值后与现有机器数量取模,均匀分配到指定机器上,选种类多的方式分布。性别只有两种只能分配到两种机器上。如果扩张,要全量的重新计算所有值,再对现有机器数量取模。
一致性哈希:
把哈希函数计算出的值看作一个环,将服务器的机器码通过哈希函数计算,均分这个环,插入数据到通过哈希函数计算后顺时针最近的机器上。 扩容机器时,插到环上,把一块区域的数据从原本管这块区域的机器中迁移到新机器 两个问题:1、数量很少的机器无法做到均分环 2、即使原来能均分,但加入或减少机器时负载不均
虚拟节点技术可以解决
虚拟节点技术: 按比例抢环,每个机器分配相同多的数据,所有数据通过哈希函数计算后去站点,就做到环中每一段数据每个机器的占比相同,增加删除机器同理。 按数据抢环可以做到分配负载,如果一个机器很强就可以多分配数据