MySQL 中的HASH详解

目录

HASH表结构

HASH冲突

解决方法

链地址法

开放地址法

建立公共溢出区


MySQL中的哈希索引(Hash Index)是一种特殊的数据库索引类型,它利用哈希表(Hash Table)的数据结构来存储索引项。哈希表通过哈希函数(Hash Function)将索引列的值转化为一个固定长度的哈希码(Hash Code),然后用这个哈希码作为索引项在表中定位数据记录的位置。这种方式使得对于等值查询(例如 WHERE column = value)能够非常快速,理想情况下接近O(1)的时间复杂度。

HASH表结构

哈希表的基础结构设计主要包括以下几个关键组成部分:

  1. 哈希函数(Hash Function): 哈希函数是哈希表的核心,它的作用是将输入的键转换为一个确定的索引值,这个索引值用于决定数据在表中的存储位置。理想的哈希函数应能均匀分布不同的键值,减少冲突,并且计算速度快。常用的哈希函数有直接定址法、除留余数法、平方取中法、折叠法、随机数法等。

  2. 数组(Bucket Array): 哈希表通常由一个较大的数组构成,数组的每个元素称为一个“桶”(Bucket)。哈希函数计算出的索引值就是数组的下标,指向存放相应键值对的位置。

  3. 冲突解决策略(Collision Resolution Strategy): 当两个或多个不同的键经过哈希函数计算后得到相同的索引值,就会发生冲突。解决冲突的方法有多种:

    • 开放寻址法:在数组中寻找下一个可用的位置(例如线性探测、二次探测、双重散列等)。
    • 链地址法:在每个桶内使用链表或其它动态数据结构存储具有相同哈希值的元素。
    • 再哈希法:使用第二个哈希函数来寻找下一个槽位。
    • 建立公共溢出区:为所有冲突的元素分配一个公共的区域。
  4. 装载因子(Load Factor): 装载因子定义为哈希表中已填入的元素数量与表总容量的比例。一个合适的装载因子可以平衡查找效率与空间利用率,过高会导致冲突增多,查找效率下降。

  5. 动态调整(Resizing): 为了维持高效的查找性能,当装载因子达到某个预设阈值时,哈希表会自动调整大小,通常是扩大数组长度并重新哈希所有元素。这一过程称为重哈希(Rehashing)。

装载因子(Load Factor)

装载因子是衡量哈希表中元素填充程度的一个重要指标,计算公式为:[ \text{装载因子} = \frac{\text{哈希表中实际存储的元素数量}}{\text{哈希表的容量}} ],或者更简洁地表示为 ( \alpha = \frac{n}{m} ),其中 ( n ) 是哈希表中元素的数量,( m ) 是哈希表的容量(即桶的数量)。

装载因子反映了哈希表的饱和度。较小的装载因子意味着哈希表有更多的空闲空间,可以减少哈希冲突,提高查找效率,但同时也会浪费更多的存储空间;相反,较大的装载因子虽然提高了空间利用率,但会增加冲突概率,降低操作效率,特别是在冲突较多时,查找、插入和删除操作可能退化为链表遍历或线性查找,时间复杂度可能变为O(n)。

动态调整

为了平衡存储效率和查询效率,哈希表通常会采用动态调整机制,即根据装载因子的变化自动调整哈希表的大小。主要涉及以下两个方面:

  1. 扩容(Resizing Up): 当装载因子达到或超过一个预设的阈值(比如0.7或0.8),表明哈希表已较为拥挤,冲突增多,性能可能开始下降。此时,哈希表会自动进行扩容操作。扩容通常涉及以下步骤:

    • 新建一个更大的数组,其容量通常是原容量的两倍或更高倍数。
    • 将原有数组中的所有元素通过哈希函数重新映射到新数组中。因为容量变大,之前冲突的元素可能在新数组中找到不冲突的位置。
    • 更新哈希表的容量和装载因子阈值。
  2. 缩容(Resizing Down): 少数情况下,如果哈希表中的元素数量显著减少,为了节省空间,也可以考虑缩容。缩容的决策较为复杂,因为它涉及到效率和空间使用的权衡,而且频繁缩容可能导致不必要的性能开销。因此,实际应用中,缩容的触发条件往往设置得比较保守,或者根本不实施自动缩容,仅在必要时手动干预。

动态调整机制确保了哈希表在不同负载下的高效运行,是实现高效哈希表的关键技术之一。通过适时调整哈希表的大小,可以在保证查询效率的同时,合理利用内存资源。

HASH冲突

哈希冲突(Hash Collision或Hash Collision),也称为哈希碰撞,是指在使用哈希函数将数据(如关键字key)映射到哈希表或哈希结构中的索引位置时,两个或多个不同的数据经过哈希处理后得到相同的哈希值,从而导致它们被映射到同一个索引位置的现象。由于哈希函数的输出范围通常是有限的,而输入数据的范围可能是无限的,因此在实际应用中,特别是在较大的数据集中,哈希冲突几乎是不可避免的。

例:如下图我们依次将这些数对 12取余,将这些数添加到对应的关键字里,但是当我们添加16时,我们发现,16和4在散列表的位置冲突了,我们必须给16安排到别的位置去。

解决方法

解决哈希冲突的常用方法包括:

链地址法

链地址法(Separate Chaining)每个哈希表的槽位(bucket)存储一个链表,所有映射到该槽位的元素都放入这个链表中。这样,即使多个键值对映射到同一索引,也可以通过遍历链表来找到对应的值。

例如:

开放地址法

线性探测(Linear Probing): 发生冲突时,从发生冲突的桶开始,顺序检查下一个桶,直到找到一个空桶为止。如果达到表末尾还没找到空位,则可能需要循环回表头继续探测(称为“闭合”或“循环”探测)。这种方法简单,但可能导致数据在表中的聚集,影响查找效率。

例如:

二次探测(Quadratic Probing): 探测序列是按照1^2, -1^2, 2^2, -2^2, ...这样的平方数距离进行,即每次探测步长逐步增加。这种探测方式试图减少聚集现象,提高查找效率。

例如:

双重散列(Double Hashing): 使用两个不同的哈希函数H1和H2,当H1(key)导致冲突时,使用H2(key)来决定步长,即每次探测的位置是H1(key) + i * H2(key),其中i是递增的探查序列。这种方法可以更有效地分散冲突,减少聚集。

建立公共溢出区

当哈希表的所有槽都被填满时,可以将额外的元素放入一个单独的溢出区或链表中。这种方法简单,但是查找效率较低,因为可能需要检查两个区域。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/7660.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JSON++介绍

1.简介 JSON 是一个轻量级的 JSON 解析库,它是 JSON(JavaScript Object Notation)的一个超集。整个代码由一个单独的头文件json.hpp组成,没有库,没有子项目,没有依赖项,没有复杂的构建系统&…

Web 3.0时代:软文发稿对企业品牌的影响

Web 3.0的到来,标志着我们已经进入了一个全新的互联网时代。在这个新时代中,信息的生成和传播有了更多的可能性和更广的空间。作为企业品牌宣传的重要手段之一的软文发稿,在Web 3.0时代将会面临什么样的挑战和机遇? 首先&#xf…

使用openssl创建https证书

原文地址:使用openssl创建https证书-腾讯云开发者社区-腾讯云 从今天开始笔者打算和大家聊一聊http2这个协议,想要说清楚http2协议就必须亲手搭建一个http2的服务,并且对比http2和http1.1的特点,从而了解http2的一些新特性。 ht…

【C语言】预处理器

我们在开始编写一份程序的时候&#xff0c;从键盘录入的第一行代码&#xff1a; #include <stdio.h>这里就使用了预处理&#xff0c;引入头文件。 C预处理器不是编译器的组成部分&#xff0c;但是它是编译过程中一个单独的步骤。简言之&#xff0c;C预处理器只不过是一…

产品专访|“产品”远程运维系统与“设备”远程运维系统的区别?

在日益复杂的工业制造环境下&#xff0c;远程运维已经成为生产制造企业不可或缺的一部分。在这个大背景下&#xff0c;产品远程运维系统和设备远程运维系统的需求越来越多&#xff0c;各自发挥着独特的作用。然而&#xff0c;尽管它们都涉及到远程运维的概念&#xff0c;但在实…

windows系统远程执行脚本部署项目操作手册

windows系统远程执行脚本部署项目操作手册 windows系统远程执行脚本部署项目 如果频繁的需要部署项目到远程的服务器上,每次要手动上传项目,然后停止项目,启动项目,很麻烦,像Linux天生支持远程执行脚本 Windows借助工具也可以做到. 安装WinSCP软件 自行下载软件或关注我的公…

linux学习:音视频编程+alsa声音架构

目录 概念 采样 量化 编码 音频文件wav 格式 标准音频接口 ALSA 录制音频 步骤 api 获取pcm设备句柄 设置 PCM 设备参数 代码 播放音频 步骤 代码 概念 信号都是模拟信号&#xff0c;不管是声音还是光线&#xff0c;这些模拟信号需要被 A/D 转换器转换成数字信…

LeetCode:盛最多水的容器

文章收录于LeetCode专栏 盛最多水的容器 给你n个非负整数a1&#xff0c;a2&#xff0c;…&#xff0c;an&#xff0c;每个数代表坐标中的一个点(i, ai) 。在坐标内画 n 条垂直线&#xff0c;垂直线i的两个端点分别为(i, ai) 和 (i, 0)。找出其中的两条线&#xff0c;使得它们与…

常见比较实用的Chrome命令/扩展程序

文章目录 一、Chrome命令二、Chrome操作三、Chrome扩展程序 一、Chrome命令 Chrome浏览器提供了一系列实用的内部命令和URL&#xff0c;这些命令可以帮助用户快速访问浏览器的各种功能和设置。以下是一些实用的Chrome命令&#xff1a; 查看所有支持的命令&#xff1a; 直接在…

24上半年软考时间安排已出!

正在备考上半年软考考试的宝子们注意啦~ 软考官网已经发布了24上半年考试时间及科目安排&#xff0c;大家仔细查看&#xff0c;确认好考试时间&#xff0c;以防错过考试。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 通知原文如下&#xff1a;↓↓↓…

利用 MyNodeQuery 搭建三网延迟监控 实时监控 VPS 网络情况

本文首发于只抄博客&#xff0c;欢迎点击原文链接了解更多内容。 前言 MyNodeQuery 是一款简洁好用的探针&#xff0c;可以作为 NodeQuery 关闭后的替代品&#xff0c;功能也基本参照 NodeQuery&#xff0c;支持节点离线通知、节点排序、自定义 Ping 节点&#xff0c;还有网速…

关于YOLO8学习(六)安卓部署ncnn模型--图片检测

前文 关于YOLO8学习(一)环境搭建,官方检测模型部署到手机 关于YOLO8学习(二)数据集收集,处理 关于YOLO8学习(三)训练自定义的数据集 关于YOLO8学习(四)模型转换为ncnn 关于YOLO8学习(五)安卓部署ncnn模型–视频检测 简介 前文第五章,讲述了部署自定义模型后,进…

构建多代开发团队的沟通与共识:方法与实践

团队中拥有各个年龄段的开发者是一种常见的现象&#xff0c;如何快速形成一套团队沟通语言、共识和知识体系是团队协作和发展的关键。下面我们就这个话题展开讨论。 1. 建立共同目标和价值观 首先&#xff0c;团队需要明确共同的目标和价值观。无论年龄段的差异如何&#xff…

关于Git的commit message规范

前几天在提交代码的时候突然发现自己的commit message写的有点问题&#xff0c;然后到网上查了下发现Git的commit message也是有规范的&#xff0c;下面我总结了三条我认为最重要的。 1.commit message需要简洁明了&#xff0c;突出变更的目的 2.提交信息的前缀用来表示你的这…

2023ccpc重庆站女生专场B.终焉之茧(交互题)

2023 c c p c 重庆站女生专场 B . 终焉之茧 \Huge{2023ccpc重庆站女生专场B.终焉之茧} 2023ccpc重庆站女生专场B.终焉之茧 文章目录 题意思路标程 题目链接&#xff1a;B. 终焉之茧 题意 给定一个无限大的平面&#xff0c;终焉之茧坐标为 [ x 0 , y 0 ] [x_0,y_0] [x0​,y0​]…

【牛客】Tokitsukaze and Average of Substring

原题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 前缀和。 开一个int类型的前缀和数组pre[30][N]&#xff08;pre[i][j]表示某字符转成的数字 i 在一段区间的前缀个数。因为字母表有‘a’~z…

git stash 工作中常用命令记录

save 可省略, 则使用最近一次的提交记录的描述来存储 git stash save “暂存内容描述” 查看暂存列表 git stash list 获取/使用 但不删除 本次暂存内容 git stash apply 默认第一个使用其他则追加 stash{number} 即可, 例如,使用第三个(从0开始) git stash apply stash{2} 获取…

理解Oracle闪回级别【Oracle闪回技术】(一)

Oracle闪回技术是数据恢复技术&#xff0c;具有恢复时间快&#xff0c;不适用备份文件。可以使数据库回到某个状态。 可以满足用户的逻辑处理的快速恢复。 但是闪回技术只是逻辑数据恢复&#xff0c;如果是数据文件损坏&#xff0c;必须依赖介质才能恢复。 闪回技术的特性&…

腾讯的EdgeONE是什么?

腾讯的EdgeONE是一项边缘计算解决方案&#xff0c;具有一系列优势&#xff1a; 边缘计算能力强大&#xff1a;EdgeONE利用腾讯云在全球范围内的分布式基础设施&#xff0c;提供强大的边缘计算能力&#xff0c;可以实现低延迟和高可用性的服务。 智能化和自动化&#xff1a;Edg…