经典哈希函数的性质(散列函数)
1.输入域无穷大
2.输出域是有穷尽的
3.输入参数相同,返回哈希值不变(不是随机函数)
4.输入不同,哈希值亦可能相同,哈希碰撞
5.离散性:举例:input-0~98,out-0、1、2,得出结果,差不多33个分布在0上,差不多33个分布在1上,差不多33个分布在2上(最重要的)
特征:
1.与输入规律无关,是一个打乱的过程(打乱函数,否则无法做均匀分布了)
2.对输入来说,哈希函数得到的结果若能在S域上能均匀分布,取模(%m)后依然均匀分布
哈希函数得到的是16位的码,每一个码上是16进制的数,这16个码彼此相互独立
工程应用:急需1000个哈希函数,并且要彼此相互独立,如何做?为何这样做独立?
用一个哈希函数,就能改出1000个哈希函数
1.split:高八位作为h1,低八位作为h2
2.两个哈希函数做函数变换,也能生成两两之间相互独立的第三个哈希函数,相互独立?
h3相对于h1、h2独立,为什么相互独立?
每一个位置,针对其他位置都是独立的
哈希表:
10:(A,17)
2:(B,3)
若存在A,但值变了,则修改值,若无A,则在当前点后再接一个
0~16:桶中个数几乎就是均匀长得
如何保证O(1)-增删改查都是O(1)
used/size=loadFactor----桶中元素数/桶数大于1时,无法保证查找时为常数规模时间O(1),扩容
扩容,倍数扩容,时间复杂度均摊,离线扩容(并行的思维)因而时间复杂度较低
jvm里,每个桶里是一个红黑树
经典情况,里面是一个链表
哈希函数很重要,比哈希表要重要
大数据题目:大文本文件查重,100TB,哈希函数(计算哈希code,取模,分流)
相同文本,一定在同一台机器上
将所有重复字符串打印出来
若有m种字符串,会将这m种字符串均匀地分到1000台机器上
1000台机器并发:哈希函数来做分流
大数据题目,有一半都是用哈希函数
哈希表是用哈希函数的桶
相同输入相同输出,不同输入均匀分布!
默认哈希表的增删改查为O(1)
准备两张哈希表
两张哈希表:当元素较少时,某些位置没有,当元素较多时,也不是完全一样
等概率随机的方式是什么?
10个元素的数组,随机一个数,再随机一个数?
做不到严格等概率,返回一个!
哈希表和map有什么区别?
在哈希表中,A和B的位置以致Z的位置,都乱七八糟的
add remove getRandom
删除会产生洞
洞太多的话,getRandom无法再使用了
map是无序的,填洞操作,并不需要维持顺序,不产生洞就OK!
将待删除元素,变为size处的元素,同时删除size位置的元素,并更新size
两个map,1.随机等概率返回一个key 2.删除
c++中的map插入一个相同key时???
一个主map,一个用于随机等概率返回的副map(str,size,分作key与value,用于O(1)时间内删,随即返回以及增补)
map1.find(str17)->first=str999;
map2.find(map1.find(str17)->seccond)->seccond=str999;
c++会忽略后面相同键值的插入操作
java——hashmap,对于已经存在的key,会直接更改对应的value
填洞,常规操作!
布隆过滤器:
解决什么问题?
100亿个URL(64字节):黑名单
看URL是否是黑名单?
hashset:至少6400亿字节
640G
设计耗费巨大代价
有失误率:URL不在黑名单,却返回在黑名单,错杀不漏杀
经典解法:哈希来,哈希去
接受失误率的话:布隆过滤器!
进入布隆过滤器:
比特类型数组需要开多大:
公式1:n:样本量/P:预期失误率:100亿,16G
公式2:确定哈希函数的个数
m和K都向上取整,因此失误率也发生改变:
数组越大,失误率越低!
公式怎么推的?查帖子!
一致性哈希:
服务器设计
经典负载均衡的结构:
加机器、减机器怎么办?!?!?!
一致性哈希结构:
不再取模了!
二分:工程上很快的
加、减机器:数据迁移的代价比较小
问题:
机器数量比较少时,不均匀
加机器后,又变成不均匀
解决:虚拟节点技术:1000个节点(统计学,以比例化解)
分布式常用一致性哈希