什么是哈希,哈希表,哈希函数,哈希碰撞?

什么是哈希?

比方我有个原始值,S=[“老铁双击666”,‘感谢老铁送的飞机’],
通过某种算法(比如java的hasecode(获得变量的物理地址))得到的666这个就是“哈希码“(将字符串转换成尽可能不重复的int类型数字),
然后通过“哈希算法“(如取余法等)获得的值比如1, 这个1就是“哈希值“,存储“1对应老铁双击666“这些关系的就是哈希表。

说明一下:上面的取余运算是666%N,N在下图的意思中是3,正常是count(S)/5,太长会产生很多空项,太短很多值会很长变成链式搜索

什么是哈希冲突?

1.拉链法:

在这里插入图片描述
上图为什么1位置后面有两个数据呢?因为其他值经过哈希运算后拿到的哈希值也可能是1,这就是哈希冲突(哈希碰撞),解决方法有很多,链地址法适用于经常进行插入和删除的情况。

2.开放地址法:

开放地址法又分线性探测法和双重哈西法

线性探测法
(图为线性探测法)

线性探测法

假设元素29哈希运算后还是29
插入元素29:元素29的哈希值为29,29%14=1,但1号元素已经有数值15了,然后检查下一个元素(2号元素),但2号元素已经有数值30了,然后检查下一个元素(3号元素),3号元素为空,插入到3号元素
搜索元素29:元素29的哈希值为29,29%14=1,检查1号元素,15!=29;然后检查下一个元素(2号元素),30!=29;然后检查下一个元素(3号元素),29=29,返回数值,查找完毕。

双重哈西法

又称再哈西法,再原来哈西函数的基础上再准备一个哈西函数2,如地址冲突,运行函数2,如又冲突,则函数2得到的值加一,再加二直到不在冲突。

总结

hash table哈希表是基于数组的一种存储方式,其存储上就是用于存储键值对(<key,value>)的集合(数组)。当要存储一个数据的时候,首先用一个函数计算 数据的地址,然后再将数据存进指定地址位置的数组里面。这个函数就是哈希函数,而这个数组就是哈希表,哈希的主要应用是哈希表和分布式缓存


注:自己的理解归纳,有错误敬请留言指正。
  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值