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…

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

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

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

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

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

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

LeetCode:盛最多水的容器

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

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

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

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

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

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

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

【牛客】Tokitsukaze and Average of Substring

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

Nessus 部署实验

一、下载安装https://www.tenable.com/downloads/nessus 安装好之后,Nessus会自动打开浏览器,进入到初始化选择安装界面,这里我们要选择 Managed Scanner 点击继续,下一步选择Tenable.sc 点击继续,设置用户名和密码 等…

HSP_06章_Python_函数

文章目录 P67 函数入门1. 基本语法2. 函数的调用3. 函数的注意事项和使用细节 P71 递归机制1. 基本介绍2.递归能解决什么问题3. 递归的重要规则 P72 函数作为参数传递P73 lambda匿名函数P74 全局变量和局部变量 P67 函数入门 1. 基本语法 2. 函数的调用 3. 函数的注意事项和使…

浅谈操作系统中的重要概念——线程(3)——设计模式

文章目录 一、什么是设计模式?二、单例模式2.1、饿汉模式2.2、懒汉模式2.3、多线程情况下调用 饿汉模式与懒汉模式 谁是安全的??(重点) 三、工厂模式 一、什么是设计模式? 设计模式就相当于菜谱&#xff0…

虚拟机文件夹共享操作(本地访问)

新建一个文件夹 右击文件夹点击属性 找到共享 点击共享 选择本地用户共享就可以了 本地winr 输入我们图片中的格式(IP前加 “\\” ) 会弹一个窗口,输入虚拟机的入户名和密码就可以共享了(一般默认用户名都是administrator&am…

C++笔记:类与对象(三)->多态

多态 虚函数 先来看一段代码&#xff1a; #include<iostream> using namespace std;class Animal { public :void run() {cout << "I dont know how to run" << endl;} };class Cat : public Animal{ public :void run() {cout << "I …

【毕业设计】基于微信小程序的校园快递平台系统设计与实现

1.项目介绍 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统校园快递平台系统信息管理难度大&#xff0c;容错率…

让我们把Domino变成SFTP服务器

大家好&#xff0c;才是真的好。 远程共享文件有很多办法&#xff0c;其中值得注意的是SFTP方式。SFTP即SSH文件传输协议&#xff0c;通过使用SSH传输层&#xff0c;SFTP可以通过Internet连接安全地访问和移动大量数据文件。 今天我们就介绍使用Domino中的HTTP OSGI方式来实现…

如何自己快速的制作流程图?6个软件教你快速进行流程图制作

如何自己快速的制作流程图&#xff1f;6个软件教你快速进行流程图制作 自己制作流程图可以是项目管理、流程设计或教学展示中的重要环节。以下是六款常用的流程图制作软件&#xff0c;它们都提供了快速、简单的方式来制作流程图&#xff1a; 迅捷画图&#xff1a;这是一款非…

echarts学习笔记:柱状图+雷达图+双环形图+地图可视化+数据传递关系图+关键词条图+数据总览图+AntV/G2/DataV

GitHub - lgd8981289/imooc-visualization: https://www.bilibili.com/video/BV1yu411E7cm/?vd_source391a8dc379e0da60c77490e3221f097a 课程源码 国内echarts镜像站&#xff1a;ISQQW.COM x ECharts 文档&#xff08;国内同步镜像&#xff09; - 配置项 echarts图表集&…