什么是Hash(哈希)?
概念:哈希即可以是一种数据结构,也可以是一种函数概念
通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系
,那么在查找时通过该函数可以很快找到该元素。
哈希(散列)方法,哈希方法中使用的转换函数称为哈希(散列)函数,构造出来的结构称为哈希表(Hash Table)(或者称散列表)
哈希算法不过是一个均匀的运算,它的输入可以是字符串,可以是数据,可以是任何文件,经过哈希运算后,变成一个固定长度的输出, 该输出就是哈希值。但是哈希算法有一个很大的特点,就是你不能从结果推算出输入,所以又称为不可逆的算法
哈希的特性
- 不可逆 : 就如同你可以通过x*y=z得到z,但你不能确定z=x*y,xy一定刚刚的数
- 运算快:20G高清电影和一个5K文本文件复杂度相同,计算量都极小。越巧妙的hash函数碰撞越少,空间利用率越高
- 结果均匀:哈希函数计算出来的地址能均匀分布在整个空间中,这时hash函数的设计原则
常见哈希函数
直接定制法–(常用)
取关键字的某个线性函数为散列地址:Hash(Key)= A*Key + B优点:简单、均匀缺点:需要事先知道关键字的分布情况使用场景:适合查找比较小且连续的情况。
除留余数法–(常用)
设散列表中允许的地址数为m,取一个不大于m,但最接近或者等于m的质数p作为除数,按照哈希函数:Hash(key) = key% p(p<=m),将关键码转换成哈希地址。
哈希冲突
哈希冲突是不可避免的
当计算出的hash值相同时,就会发生哈希冲突。常用的解决哈希冲突的方法有两种:
1.闭散列(开放定址法)
当发生哈希冲突时,如果哈希表未被装满,说明在哈希表中必然还有空位置,那么可以把key存放到冲突位置中的“下一个” 空位置中去。那如何寻找下一个空位置呢?
其中最简单的就是线性探测
- 若没有冲突则直接插入值
- 若有冲突则向后查找至空位插入值
但这么做有弊端:
一旦发生哈希冲突,所有的冲突连在一起
,容易产生数据“堆积”(查找时会多次重复比较,大大降低查找效率)即“踩踏效应”
二次探测
:线性探测的缺陷是产生冲突的数据堆积在一块,这和找下一个空位置有关系,因为找空位置的方式就是挨着往后逐个去找,因此二次探测为了避免该问题,他不再是挨着找下一个空位置,而是平方式的跳跃找下一个空位置,这样冲突就不会堆积在一片,而是会相对散开一些。
载荷因子
α是散列表装满程度的标志因子。由于表长是定值,α与“填入表中的元素个数”成正比,所以,α越大,填入表中的元素较多,产生冲突的可能性就越大;α越小,填入表中的元素较少,产生冲突的可能性就越小
通常,只要a取的合适(一般取0.7-0.8之间),哈希表的平均查找长度就会是常数也就是O(1)级别的。
GO的载荷因子为6.5 但长度为8
闭散列的删除
采用闭散列处理哈希冲突时,不能随便物理删除哈希表中已有的元素,若直接删除元素会影响其他元素的搜索。如上图的11,删除11之后,查找5就会误报。
闭散列最大的缺陷就是空间利用率比较低,这也是哈希的缺陷
2.开散列 又名链地址法(开链法)
首先对关键码集合用散列函数计算散列地址,具有相同地址的关键码归于同一子集合,每一个子集合称为一个桶,各个桶中的元素通过一个单链表链接起来,各链表的头结点存储在哈希表中
首先对关键码集合用散列函数计算散列地址,具有相同地址的关键码归于同一子集合,每一个子集合称为一个桶,各个桶中的元素通过一个单链表链接起来,各链表的头结点存储在哈希表中
GO的map底层bucket桶即使用这个方法
那如果就是出现了极端的情况,所有的数此时都冲突到一个桶中,那么这个桶中的数据就会太多了,应该怎么办?
- 将此时的链表改换挂红黑树
- 多阶哈希(不常使用)
什么是Hash(哈希)?相关推荐
- P2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold(加强版)(贪心+hash哈希)
P2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold(加强版)(贪心+hash哈希) 洛谷上这道水题丧心病狂地把数据范围加到了500000 普通的做法肯定A不了了, ...
- Hash+哈希+哈希函数
Hash+哈希+哈希函数 hash == 散列 == 哈希 是一种有损压缩技术 是一种数字指纹技术 哈希是一种加密算法 哈希函数(Hash Function),也称为散列函数或杂凑函数.哈希函数是一个 ...
- Hash+哈希表+HashMap+HashSet
Hash+哈希表+HashMap+HashSet 哈希算法,是一类「算法」. 哈希表(Hash Table),是一种「数据结构」. 哈希函数,是支撑哈希表的一类「函数」. Map是映射/地图的意思,在 ...
- Hash哈希(hashCode、HashSet 、HashMap)
文章目录 Hash HashMap类 存储 HashMap的长度 Java的hashCode()方法 hashCode() 与 equals() 的关联 情况1(不重写hashCode()和equal ...
- Algorithm:C++语言实现之Hash哈希算法相关(dbj2、sdbm、MurmurHash)
Algorithm:C++语言实现之Hash哈希算法相关(dbj2.sdbm.MurmurHash) 目录 一.Hash知识 1.dbj2 2.sdbm 3.MurmurHash Hash Has ...
- 什么是Hash哈希(散列表)
什么是Hash哈希(散列表) 相信学计算机的各位都绝对听过Hash哈希(散列表),有些人认为Hash是一种算法,有人认为它是一种数据结构,其实这些说法都不算太准确.其实hash是一类算法的集合,或者说 ...
- redis之Hash哈希类型以及存储原理
文章目录 1.概述 1.1Redis数据类型 中文官网 (不推荐,更新不及时) 1.2.Redis数据类型 英文官网 (推荐) 2.Hash哈希类型的相关命令 2.1.命令参考地址:http://re ...
- hash crc32_Hasher Lite.小巧实用的HASH(哈希)计算小工具
之前很早的时候程门立学分享过一款计算哈希值的神器小软件,详见HashCalc-MD5.SHA1.CRC32.OR.etc计算校验-windows系统神器之一 ,该软件非常小巧及强大.今天介绍的这款Ha ...
- java 图片 哈希值_上传图片用图片文件的对象hash哈希值判断图片是否一样,避免重复提交相同的图片到服务器中...
上传图片用图片文件的对象hash哈希值判断图片是否一样,避免重复提交相同的图片到服务器中 前端:要用到一个插件,点击下载 企业用户后台管理系统 - 谭人才招聘系统 function ajaxfile( ...
- K:hash(哈希)碰撞攻击
相关介绍: 哈希表是一种查找效率极高的数据结构,很多语言都在内部实现了哈希表.理想情况下哈希表插入和查找操作的时间复杂度均为O(1),任何一个数据项可以在一个与哈希表长度无关的时间内计算出一个哈希值 ...
最新文章
- 1、为什么使用Long时,推荐多使用valueOf方法,少使用parseLong方法
- 独家 | AI仍然受困于仇恨言论——但科学家们在衡量每个系统失败的地方正做得越来越好...
- ffmpeg进行混音,将两路音频pcm数据合成一路输出
- 从零开始学前端:初识函数,合法属性与自定义属性 --- 今天你学习了吗?(JS:Day2)
- Hibernate SqlQuery
- CStatic类简介
- IBM Machine Learning学习笔记(二)——Supervised Learning: Regression
- criteria函数_1.2.21 EXCEL篇之函数篇-数学与三角函数1
- python反转一个三位数_反转Python整数的位
- qml 发光_“木头”也能发光,研究人员:或用于家庭照明及显示
- MAC上DOS常用命令操作
- 《大数据时代》读后感,维克托
- 压电式雨量传感器介绍说明
- 轻松玩转微信公众号排版
- ISCC 2022 wp
- 彻底卸载secureCRT
- java项目实战-超市管理系统(三)页面设计源码
- vscode设置C++代码格式化(Clang-Format)
- Python 提取图片中的GPS信息
- Java面试必备240个知识点
热门文章
- python导入excel加入折线图_Python之openpyxl插入折线图方法
- 《雍正皇帝》文化专有词翻译策略的研究现状(Baker)
- 调用Python的PyAutoGUI模块模拟登录QQ邮箱
- linux脚本 取日期格式,PowerShell中使用Get-Date获取日期时间并格式化输出的例子
- anchor和正负样本
- python刷题记录:买帽子
- 直接管理和维护计算机系统的程序称为,全国2008年04月自学考试计算机原理试题及答案.doc...
- 海马玩模拟器离线安装包下载方法
- 安卓系统强制旋转屏幕实现横竖屏切换
- wps怎么图片透明_wpsword如何设置图片透明度