1、认识哈希函数
(1)一般来说输入是无穷,输出的有限的,常见的例如md5\sha1算法
(2)一个哈希函数,如果输入是相同的,那么输出的一定相同,就是意味着哈希函数没有任何随机因子
(3)不同的输入可能会导致相同的输出——哈希碰撞
(4)哈希函数的离散型、均匀性
2、哈希表的实现
1、加入N个字符串,对哈希表进行扩容,次数为O(logN),每一次扩容的时间代价为O(N),最后扩容完成的总代价为O(N*logN),单次的扩容代价为:O(N*logN)/N——O(logN),为什么可以使用哈希表的时候时间复杂度看作O(1):因为可以把扩容链设的很长,减少扩容代价,逼近O(1)。
2、离线扩容技术:因为JVM托管,可以在新的内存扩展新的哈希表,再把用户流量引到新的哈希表,所以时间代价更加毕竟O(1)
题目一:
3、详解布隆过滤器
建立一个有增改查的集合,整体占的内存更小,允许一定不可避免的错误率,可以设置变得很低(不会出现比如本身是黑名单成员但是反馈说不是黑名单,只会出现本身是白名单但是反馈是黑名单)
3.1位图:bit arr\bit map
bit数组:每一个位置的信息占内存1bit:用基础类型构造
3.2 布隆过滤器:
在一个长度为m的位图上,对需要加黑名单的url进行k个哈希函数哈希运算,得到的值%m,算出来的值在对应的位图上标记。查询:拿到一个url,对其进行k次哈希函数运算,%m查询位置上是否为已标记,全部都是的话就是黑名单
3.2.1 影响失误率的因素:
1、m的长度(最主要)
2、k个哈希函数(根据样本量和m、预期失误率来决定k要多大)
3.2.2设置布隆过滤器(关注两个变量:h样本量大小、p失误率)
1、确定是不是使用布隆过滤器(有没有删除操作、允不允许一定的失误率)
2、确定失误率是多少
3、单一样本大小与设置布隆过滤器无关
m是内存大小,例如100亿条数据,失误率为万分之一,算出来m大概是26G
哈希函数个数k:
实际失误率p真:
4、详解一致性哈希原理
哈希key的选择,要选择种类多的的key来做数据划分,来保证不同频率可以均匀分布在不同的服务器上
使用虚拟节点解决潜在问题。