哈希函数:f(input) :
特征1.输入域无穷大,输出域是有限大的。
特征2.相同的输入,就会有相同的输出
特征3.不同的输入,会有可能有相同的输出(哈希碰撞)
特征4.当输入样本巨大无比的时候,输出域中的每个值 命中次数都是均匀增长的(哈希函数越好,这个特征越明显)
哈希函数的作用之一是使得 对于输入集合 不管输入顺序(输入到哈希函数进行计算)之间有什么关系 ,输出值的规律都跟他们没关系(使得输入集合经过计算之后 具有离散性)
例题:大数据类型
有一个大文件 拥有很多URL,想知道文件中哪个URL出现的次数最多。
由于文件数据量巨大 单机内存放不下,那就需要多个计算机。比如我们给出100台计算机
1.将文件中的每个URL通过一个哈希函数得到一个哈希值hash_code
2.再将每个hash_code%100 将相应的URL放入相应的机器上去
通过哈希函数的计算,使得分配到每个机器的URL的种类都差不多(哈希函数性质导致)
3.然后再把每台机器里面的数据计算出词频最高的URL,100台机器中最大的就是答案
判断当前这个URL是否在黑名单中
布隆过滤器:
位图:bit类型的数组
bit[M] 下标0~m-1 。k个hash函数(h1 , h2 , h3 , … , hk) (函数之间互相独立)
对于每个URL,经过hash函数hi的计算,得出结果ci,接着将ci%M,然后将bit【ci%M】置1.(0<i<=k). 这样就算把这个URL加入了黑名单
将所有文件中的URL加如黑名单
当我们要查找一个URL是否在黑名单中,则需要把这个URL分别放入1个hash函数计算得出结果ci,随后将ci%M,判断bit【ci%M】是否为1。 当经过所有hash函数计算且bit【ci%M】都是1 则这个URL为黑名单,否则URL不在黑名单
M和k的公式:当M和k越大,失误率就越小
当你拥有两个理想的hash函数a,b。我们可以用图片内的方式创造另外的hash函数
经典服务器组织结构:
将所有任务的散列值放在环上(使用MD5 hash算法,环的范围可以是0~2^64,也可以是别的,按照实际情况),再将所有机器按照某种属性经过hash函数离散到环上,一个机器m1负责从它自身开始 按逆时针走,一直遇到下个机器mx。在这个范围里(m1,mx) 这些散列值 属于m1机器负责执行的范围
任务有散列值后怎么找机器呢?
将机器的散列值排序,任务散列值通过二分找到归属机器
存在问题:负载不均衡,因为机器的散列值可能无法均匀分割环
一致性哈希(一种服务器组织结构):
虚拟节点技术:给一台机器分配1000个虚拟节点(m1_1,m1_2,…,m1_1000),m1是某机器的名字。以后这些虚拟节点来抢占环上的空间,而不是这些机器本身
若有k台机器 每个机器分配1000个虚拟节点
m1_1,m1_2,…,m1_1000
m2_1,m2_2,…,m2_1000
m3_1,m3_2,…,m3_1000
…
mk_1,mk_2,…,mk_1000
一共有k1000个虚拟节点来抢占环上的区间(这些节点是离散的)。将来 若有任务映射到m5_4的区间上,则实际是要把此任务归属于m5机器。以此类推
这样m1~mk机器都是会被均分任务(负载均衡)
新增机器:给新机器m(k+1)分配1000个虚拟节点,将这些节点离散(通过哈希函数)到原来的k1000节点之间,那么m(k+1)_x节点逆时针走 到任意节点之间的任务区间都是属于机器m(k+1)的(也就是从原来k*1000个节点划分区间中再散列1000个节点)
最终机器m(k+1)将拿走 n/(k+1) 个任务 其他机器也将变成 n/(k+1) n:任务数量
节点数量:根据机器运算能力,调整虚拟节点的数量(机器预算能力的比例=机器之间节点数量比例)