对于哈希的一些学习第一版

标题哈希的特性

1、 输入域无穷大
2、 输出域有穷尽
3、 当你输入参数固定,返回值固定
4、 输入不一样,输出可能会出现相同(哈希碰撞)
5、 输入很多不同值,将会在s域上均匀的布置。

普通哈希表的扩容:
如:将容量为17的哈希表扩容到100,主要是将原哈希表的数据重新进行哈希计算,获得哈希值后存到扩容后的哈希表

哈希表的应用:
大文件中的重复数据怎么处理:
1、准备多个机器
2、读入数据,并计算对应的hash表
3、将相同的hash值放在同一个机器中
4、在每个机器进行去重操作
哈希表的缺点:
1、占用大量内存空间(解决:采用布隆过滤器)
2、扩容进行对数据的重新计算比较麻烦(shiyi解决:一致性哈希)

举例:现在有100亿个黑名单url,每个64字节,然后给你一个url判断是否在黑名单中
如果使用哈希表,这个哈希表一定是一个非常大的,占用内存比较多,显然不是很合适,这个时候可以使用布隆过滤

布隆过滤器:
作用:查某一个东西是否在集合中
原理:
1、构建一个比特数组,容量为m
例如:一个int 类型的数据是4个字节也就是32个比特
那么 Int[] arr = new int[1000] //表示1000*32大小的比特数组

2、将url使用多个哈希函数生产哈希值,利用哈希值将对应在比特数组中的 位置进行描黑,多个哈希值将产生多个位置上的描黑
2.1 利用多个哈希函数计算url,得出多个哈希值
2.2 找出哈希值对应在比特数组中的位置,将其设置为1
2.3对每个哈希值做2.2的操作
3、判断黑名单:
将url进行多个哈希后,产生对应的值,形成比特数组中的位置变黑。对其黑名单数组进行判断。

缺点:会用失误率,比特数组越小,失误率越大

比特类型的数组到底需要多大(大小设计会影响失误率)
M:比特数组的大小,n: p: K:
M =nlnp/ln22
K=ln2
m/n=0.7m/n
1-e(-n
k/m)

一致性哈希(一种服务器的设计)

原服务器的设计(多个机器):

1、输入数据-> 2、计算哈希值-> 3、根据哈希值判断应该存在那个机器上
取数据-> 4、计算哈希值-> 5、获取对应的值。
缺点:增加机器/减少机器造成问题,将所有数据进行重新计算哈希?显然是不可能的

一致性哈希:
建立一个环(哈希值的输出范围),将3台机器放在环上,

计算一个数据的哈希值,将其放到环上,然后将数据放到顺时针最近的机器上

实现:将所有机器的值计算哈希,排好序,计算数据的哈希值后利用二分法放到右面离你最近的机器

增加机器:机只需要将属于自己的数据转移进来就好
减少机器:将机器中的数据转移到顺时针第一台机器就可以
缺点:机器的分布不固定(解决使用虚拟节点和路由表)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值