哈希简单入个门

#哈希
##1.哈希的基础
Hash,散列
哈希:指的是让数据关键字和最终的存储位置之间有一个确定的哈希关系(对应关系),使得每一个关键字(值)都对应一个存储位置,对于这种对应关系叫做哈希函数(散列函数)

哈希表:让数据存储位置和数据关键值本身产生某种联系,方便第一时间找
采取这种哈希函数,将数据记录在一片连续的存储空间内,这一片连续的存储空间一般
10 11 22 33 44 55 66 77 88 99
0 **1 **2 *3 *4 *5 **6 *7 *8 **9
y=x%格子数 y:最终存储下标 x:数据关键字 (除留余数法)
如果想找到99 99%10=9 所以99就在哈希表的9号下标

哈希冲突:不同的数据关键字根据哈希函数查找,得到了相同的的存储位置,这时则发生了冲突

总结:根据设定好的哈希函数以及发生哈希冲突的解决办法,将一组数据通过哈希函数可以映射到一组连续且有限的地址集(空间)内,将映射结果记录在一个表内,这个表就是哈希表,种映射过程叫做散列或哈希造表,这个映射关系叫做哈希函数或者散列函数

哈希是一种思想,算法中只要用到这种思想,就是哈希算法,哈希既是一种存储方法也是一种查找方法

2.哈希的构造方法(6种)
直接定制法:
f(关键字)=a*关键字+b (a,b都是常数)

数字分析法:
分析数字中最不可能重复的几位取出来

平方取中法:
将关键字平方后,取中间三位或几位数存起来,适合位数少的关键字

除留余数法:y=x%格子数 y:最终存储下标 x:数据关键字 (除留余数法) f(关键字)=关键字mod p p:为小于或等于表长

随机输法:

折叠法:
将关键字分为几位再分为几组 再将每个组求和,再取后三位,适合于位数较多的关键字

3.解决哈希冲突的方法(4种)
开放定址法:
###线性探测法:如果位置被占了,一直往右探测,直到找到位置,但是容易产生堆积
f(关键字)=(f(关键字+d)mod 格子数) (d=1 2 3 …m-1)
###二次探测法:为了不让关键字都向右堆积,所以让它左右两边都进行探测,直到找到位置
f(关键字)=(f(关键字+d)mod 格子数) (d=1平方 -1平方 2平方 -2平方 3平方 -3平方…m-1)

再散列函数法:
f(关键字)=PH i(关键字) i=多种哈希函数轮换上

链地址法:
如果冲突了,就将该地址设立带有头结点链表,再将同一地址的所有值都放进链表中,找相同的关键字时,遍历该表就可以了

公共区溢出法:
建立一个溢出区(也就是一个表),将冲突的所有关键字都放进这个溢出区里(也就是这个表里),想找一个发生冲的关键字时,哈希表里没有,就去遍历溢出区,找这个值

4.一致性哈希 虚拟节点
有6w张照片 3台服务器
找一张照片
提取图片关键字%服务器个数
0 -》a 1-》b 2-》c
由于服务器的数量可能发生改变,则会导致服务器中的映射关系改变,找不到,所以有了一致性哈希
假设有一个⚪
⚪上有2的32次方个ip地址,将A,B,C三个服务器绑定在⚪上的某个地址,当关键词取余得到A-B B-C C-D 某个区域 按顺时针或者逆时针 存放在它遇到的第一个服务器里,当其中一个服务器坏了或者添加新服务器,影响的区域小

有些时候影响的区域大了,这叫哈希偏斜,就需要虚拟节点
有A,B,C三个服务器真实存在
这是给他们各自虚拟出三个虚拟器(分身)A1 A2 A3 B1 B2 B3 C1 C2 C3 (虚拟) 一共十二台
当关键字落到某个虚拟器范围,遇到虚拟结点等于遇到本身 ,谁的虚拟结点谁存进谁里面

5.布隆过滤器(海量数据去重)
一组非常长的二进制矢量+一组哈希函数
一个数通过一组哈希函数得出关键字,然后把关键字的里面的二进制改为1
如果得出的几个关键字 下标里面都是1那么他可能存在
如果只要有一个关键字里存的不是1这个数就绝对不存在
优点:1.确定一个值不在,绝对不在
2.占用空间小,3.插入效率高,4.安全,里面不存储数据原始值,只存储特征值
缺点:但是要确定一个值在,那这个值不一定存在,会发生误判(如果通过一组哈希函数计算得到的位里都是1,但是不能保证它一定存在)2.删除不了数据

降低误判率:1.提升哈希函数组里的个数,2.二进制数组扩大

int -21e~21e
char -128~127
short -32767~32768

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值