Hash函数学习笔记

【算法学习笔记】哈希函数与哈希表 布隆过滤器(Bloom Filter)是一种空间效率非常高的随机数据结构,用于快速判断一个元素是否属于某个集合,它的优点是空间和时间复杂度都比较低,缺点是有一定的误判率。具体来说,一个布隆过滤器包括一个位数组(详细说明见下文)和若干个哈希函数。首先将所有元素的哈希值映射到位数组上,将相应的位置设为1。当判断一个元素是否存在于集合中时,先将该元素的哈希值映射到位数组上,检查相应的位是否都为1,若有一位为0,则该元素一定不存在于集合中,若都为1,则该元素可能存在于集合中(可能存在误判)。 阅读详情
 Hash函数是一种映射关系,通过一种映射关系,将原本的字符串,数字或其他关键信息转换为一个索引值。
用数学关系式表示为:
   index  =  function(key)

数序上有不同的映射关系,不同的key,有可能会获取相同的index,这个时候的index就是有重码,也就是collosion,这就导致了Hash函数的不唯一性,从而在查找index下的关键字时也是有冲突的。

目前一些常用的数学映射关系为:
   1、直接定址法,就是直接使用key作为index
   2、数字分析法,取key中的若干位数作为index,有较多冲突
   3、平法取中法,取key的平方,然后取中间几位作为index(index与key值密切相关),
   4、折叠法,将key从中间分割成几个部分,然后按照一定规则相加获取的结果为index。
   5、除留余数法,将key对某个数值m求余,获取的余数即为index,显然indxe<m,也就是如果key>m,必然会有n-m个冲突存在(n为key关键字的个数)。
   6、随机数法,将key值通过随机数求取index,即function(key)=random(key),伪随机数的均匀性较好,当关键字长度不相等时,用此法构造较为恰当。

解决冲突:
    其实并不是将冲突去掉,而是通过一种变通的方法,将冲突变得可以唯一查找,而不是有冲突就没有唯一的index位置了。
   解决方法有:
    一、开放定址法:
             index = (function(key)+di)mod m
               di:增长序列,m哈希表长,d的求取方法有下面集中。
      1、线性探测再散列,就是查找或插入时,如果发生冲突,就线性排列下去,下面还有冲突,继续排列下去,直到没有冲突时,查找结束或添加index。d=1,2,3,……,m-1
     2、二次探测再散列,d=1^2,-1^2,2^2,-2^2,……,±k^2(k<=m/2)
     3、伪随机探测再散列,d=random(key)
  二、再Hash法
        即将index冲突的key关键字进行另一种Hash算法,得到key关键的index2索引值,从而来降低和避免冲突,当然要将冲突完全避免,则需要多个Hash算法隐含在其中。
 三、链地址法
        当Index发生冲突时,将同一个index下冲突的key值都放在以index开头的链表中,这样index开头的链表中的key都可以比较方便的查找出来。
四、建立溢出表
         建立一个和key关键字一样多的index索引,当index发生冲突时,将所有发生冲突的key或index都放在溢出表中。

Hash表查找:
  
// -------开放定址Hash表的存储结构------------
int hashsize[]={997,...};  //Hash表容量递增表,一个合适的素数序列
typedef struct{
   ElemType 
*elem;           //数据元素存储基址,动态分配数组
   int              count;          // 当前数据元素的个数
   int              sizeIndex;   //hashsize[sizeIndex]为当前容量
}
HashTable;

//--------链接地址Hash表的存储结构---------------
typedef struct childchain
{
   ElemType data;   // 数据值
   struct childchain *next;  // 下一个childchain值,NULL结束
}ChildChainHash

  typedef struct mainchain{
    int index;   // 主链的索引值
    ChildChainHash  *child;  // 指向冲突的child子链,当没有冲突时,给予NULL值。
   struct mainchain *main;  //
}
MainChainHash;

#define SUCCESS 1
#define UNSUCCESS 0
#define DUPLICATE -1
采用链接构建Hash的思路,MainChainHash申请一个head指针和若干个变量,然后main指针依次指向下一个MainChainHash指针,而每一个child指针,指向ChildChainHash链中的值,这样一个Hash表就 构造完成了。当主键key使用Hash一下获取的Index时,通过Index索引值知道Child链,从而构造了一个核实的Hash表。

// 采用开放式哈希表的存储结构

Status SearchHash(HashTable H, KeyType k, 
int &p, int &c)
{
     
// 开放地址哈希表H中查找关键字k的元素,若查找成功,以p指示待查数据,
   
// 元素在表中位置,并返回SUCESS,否则,以p指示插入位置,并返回UNSUCESS,
   
// c用以计冲突次数,其初值置零,供建表插入时参考
  p  = Hash(k);   // 求得hash地址表
  while( H.elem[p].key != NULLKEY &&   //该位置中填有记录
           !EQ( k,H.elem[p].key)                 // 并且关键字不相等
          collision( p, ++c) ;                  // 求得下一探索地址p
   if (EQ(K, H.elem[p].key ) )
          
return SUCCESS;                 // 查找成功,p返回待查数据元素位置
   else
         
return UNSUCESS;              // 查找不成功.( H.elem[p].key == NULLKEY )
                                                      
// p返回的是插入的位置
}
// SearchHash

Status InsertHash( HashTable 
&H, ElemType e)
{
     
// 查找不成功时,插入数据元素e到开放定址Hash表H中,并返回OK,
    
// 若冲突次数过大,需重新构建Hash表
   c = 0;
   
if( SearchHash( H,e.key,p,c ))
        
return DUPLICATE;           // 表中已有与e有相同关键字的元素
  else if ( c <hashsize[H.sizeindex]/2 )  //冲突次数c未达到上限时,(c的阈值可调)
  {
         H.elem[p] 
= e; ++H.count; return OK;    // 插入e
   }

   
else 
  
{
     RecreateHashTable(H);
    
return UNSUCESS;    // 重建hash表
  }

}
  // InsertHash
摘抄自严蔚敏的C数据结构中Hash章节。

Hash表最大的特点:
    不管n有多大,即表有多长,我们总可以选择一个合适的装填因子以便将来平均查找长度限定在一个范围之内。

查找长度
链地址:
          S=1+α /2
线性探测:
          S = 1/2 (1+1/(1-
α ) )
伪随机探测:
          S = -1/
α ln(1-α )





 
【区块链学习笔记01】BTC-密码学原理-哈希函数 一. 哈希函数 区块链中最基础的密码学原理就是哈希算法,以下为哈希函数的简单介绍: 哈希函数是一种只只能加密但是不能解密的算法,哈希函数可以将任意长度的信息转化为固定长度的字符串。类似“8b46ec792e943de34605981980751a3c1e008218f77eeb27e474b594f7685019”这样。 当输入相同的值时,得到的输出值也一定相同。 就算输入值有一点不同,得到的输出值会天差地别。 (这里可以看到虽然只改了一位数,但是输出的哈希值完全不同) 输入值与输出值之间没有反向推 阅读详情

相关推荐

一篇文章搞懂C++实现哈希算法

哈希算法,也称为散列算法,是一种从任意长度的输入数据创建固定大小输出的方法,这种输出通常被称为“哈希值”、“散列值”或简单地“哈希”。在计算机科学中,哈希算法主要用于快速数据查找和数据结构中的高效数据管理,如哈希表。哈希也是加密和数据完整性验证的基础。哈希算法通过一个称为哈希函数的数学过程来运作。这个函数接受输入(称为“预映射值”)并返回一个通常较短、固定长度的哈希值。这个哈希值在理想情况下为每个不同的输入值提供一个唯一的标识(尽管在实际中这并不总是可能的)。

weixin_73570479的博客 4927

数据结构----哈希表(散列表)

一、哈希表的概念 哈希表(Hash table,也叫散列表),是根据关键码值(Key-value)而直接访问在内存存储位置的数据结构。也就是说,它通过把键值通过一个函数的计算,映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做哈希函数,存放记录的数组称做哈希表。 哈希函数:也称为是散列函数,是Hash表的映射函数,它可以把任意长度的输入变换成固定长度的输出,该输出就是哈希值。通过...

心中的日月的博客 3296

相似图像搜索的哈希算法思想及实现(差值哈希算法和均值哈希算法)

图像相似度比较哈希算法: 什么是哈希(Hash)? • 散列函数(或散列算法,又称哈希函数,英语:Hash Function)是一种从任何一种数据中创建小 的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定 下来。该函数将数据打乱混合,重新创建一个叫做散列值(hash values,hash codes,hash sums, 或hashes)的指纹。散列值通常用一个短的随机字母和数字组成的字符串来代表。 • 通过哈希算法得到的任意长度的二进制值映射为较短的固定长度的二进制

瞳瞳瞳呀 4206

哈希(Hash)的详细介绍

Hash,一般翻译做散列、杂凑,或音译为哈希,是把任意长度的 输入 (又叫做预映射pre-image)通过散列算法变换成固定长度的 输出 ,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。(逆推是不行的啦就是说)

m0_71417856的博客 6796

密码学之哈希算法

1 哈希算法 哈希算法是将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性。一般用于快速查找和加密算法。 哈希算法又称为摘要算法,它可以将任意数据...

star_yang的博客 1万+

Windows下快速搭建Kettle开发环境:基于9.4.0.0版本的保姆级教程

本文提供Windows系统下Kettle 9.4.0.0开发环境的详细搭建指南,涵盖源码获取、Maven配置优化、高效编译及部署运行全流程。通过实战验证的步骤和常见问题解决方案,帮助数据工程师快速完成环境配置,提升ETL开发效率。

weixin_28829479的博客 332

数据结构-Hash(哈希)基本特征

HashMap的实现原理是先要找到要存放数组的下标,如果是null的就存进去,如果不是null的就先判断key值是否一样,如果一样就替换,如果不一样就以链表的形式存在链表中(从JDK8开始,根据元素数量选择使用链表还是红黑树存储。例如上面存放7,8,9时,7直接存入索引为0的位置。8本来应该存到索引为1的位置,但是已经满了,所以向后找,索引3的位置为null,所以8存到索引3的位置,同理9存到6的位置。元素时,会先将目标位置前后的空间搜索一下,将标记为null的位置回收掉,这样大部分不用的位置就收回来了。

2202_75468818的博客 1921

Windows本地部署Qwen3-14B实战指南:Ollama+Open WebUI零Docker方案

大语言模型本地部署是AI工程化落地的关键环节,其核心在于推理框架兼容性、硬件加速适配性与端到端稳定性。Ollama作为轻量级模型运行时,原生支持Windows DirectML与CUDA,规避了Docker/WSL2虚拟化开销和llama.cpp编译风险;Qwen3-14B则凭借128K上下文、Tool Calling原生支持及中文长文本结构化能力,成为政务、金融等场景首选。本文聚焦Windows平台真实约束——显存阈值、驱动版本匹配、路径编码兼容、离线知识库集成(RAG)等工程细节,提供经63台Windo

weixin_32136203的博客 413

什么是Hash?

原文链接:https://www.cnblogs.com/ktao/p/8714513.html 什么是Hash?   Hash中文翻译为散列,又成为“哈希”,是一类函数的统称,其特点是定义域无限,值域有限。把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入...

不抛弃、不放弃:Aaron莫言 5240

宿舍网速跑不满?可能是PPPoE的锅!实测OpenWrt切换DHCP+深澜认证,轻松跑满校园百兆宽带

本文探讨了校园网PPPoE协议的性能瓶颈问题,并提供了通过OpenWrt路由器切换DHCP+深澜认证的技术方案,实测可显著提升网速至百兆宽带满速。文章详细介绍了配置步骤、性能对比及常见问题解决方案,帮助用户优化校园网体验。

weixin_31310913的博客 383

避坑指南:解决‘Logical volume contains a filesystem in use’错误,顺利完成LVM根目录扩容

本文详细解析了Linux系统中LVM根目录扩容时遇到的‘Logical volume contains a filesystem in use’错误,提供了从错误诊断到实战解决方案的完整指南。通过动态扩容技术、单用户模式操作和LVM快照等方案,帮助管理员顺利完成根目录扩容,避免数据丢失和系统崩溃。

weixin_28702105的博客 227

哈希表(hash)介绍

哈希表(hash)介绍

weixin_46713695的博客 1367

如何使用VNC对openEuler系统进行远程图形化操作

本文详细介绍了在openEuler系统中配置VNC远程图形化操作的方法。主要内容包括:1)服务端配置:安装GNOME图形界面和TigerVNC服务,创建VNC用户并设置密码,配置VNC服务启动脚本;2)客户端连接:使用VNC Viewer等工具连接服务器;3)常见问题解决方法。通过5901端口建立连接后,用户可远程操作openEuler图形界面,适用于需要图形化管理的场景。

2501_93651177的博客 315

【哈希】Hash函数算法和Hash碰撞

本文章为学习笔记,总结下常用的算法。

葫芦娃子救我的博客 697

OpenClaw 超级 AI 实战专栏【实战案例】(五)邮件收发 + 日历日程 + 文件管理一站式搞定

OpenClaw 实现办公自动化核心是模块解耦:邮件收发、文件管理、日历日程各自封装,便于维护和扩展;开发中需重点解决编码兼容、权限配置、时间格式、重复处理四大类坑点,核心思路是 “提前校验 + 异常兜底 + 统一格式”;敏感信息(邮箱密码、API Token)务必通过.env管理,避免硬编码泄露。

qq_36130719的博客 742

利用恒源云在云端租用GPU服务器训练YOLOv10模型(包括Linux系统命令讲解)

为当涉及到深度学习的训练任务时,GPU的计算能力是不可或缺的。相对于传统的中央处理器(CPU),图形处理器(GPU)具有更强大的并行计算能力,能够显著加速深度学习模型的训练过程。深度学习算法通常涉及大量的矩阵运算和张量操作,而GPU的并行计算架构使得它们能够高效地执行这些计算,从而加速模型训练的速度。恒源云是一个经济高效的云计算平台,您可以通过恒源云的控制台或者命令行界面来管理实例、上传和下载数据、执行训练任务等。

Snu77的博客 1891

数据结构与算法之美 | 学习笔记17 —— 哈希算法(散列函数)应用

一、哈希算法 哈希算法需要满足的几点要求: 从哈希值不能反向推导出原始数据(所以也叫单向哈希算法);(重要) 即使原始数据发生很小改变,得到的哈希值大不相同; 散列冲突的概率小;(重要) 算法执行效率高效,对较长的文本,也能快速计算出哈希值; 例如,MD5算法的哈希值是128位的Bit长度,对任何长度的文本都会得到相同的哈希值: MD5("今天我来讲哈希算法") = bb4767201ad42c74e650c1b6c03d78fa MD5("jiajia") = cd611a31ea969b908932

跟一大桃一起学习 512

36、真核生物RNA PolII启动子预测相关研究

本文综述了真核生物RNA聚合酶II启动子预测的研究进展,涵盖转录调控机制、核心启动子元件(如TATA框、INR、GC框)、转录因子结合位点预测的挑战与方法。介绍了基于权重矩阵、神经网络和隐马尔可夫模型等多种启动子预测算法,并探讨了启动子分类策略及评分加权方法。通过Hertz-Stormo-Hartzell流程和基因微阵列分析实例,展示了如何识别保守调控序列。文章还总结了当前预测技术的局限性,提出了整合多组学数据、开发深度学习模型、加强实验验证等未来研究方向,旨在提升启动子识别的准确性与生物学意义。

palm99的专栏 187

哈希函数学习笔记

哈希函数(Hash Function)是一公开函数,用于将任意长的消息M映射为较短的、固定长 度的一个值H(M),又称为散列函数、杂凑函数.我们称函数值H(M)为哈希值、杂凑值、杂凑码、 或消息摘要。杂凑值是消息中所有比特的函数,因此提供错误检测能力。消息中任何一个比特或者几个比特的改变都会造成杂凑值的改变。总结:密码学上安全的哈希函数H应该包含的性质:①对于任意的消息x,计算H(x)是容易的。②H是单向的③H是强抗碰撞的对于给定的哈希值h,试图找到满足H(x)=h的x。对于m位的哈希值,穷举的规模大约是2

qq_54223524的博客 9969

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

[学习笔记] 哈希函数和 SHA256

哈希函数(Hash),也称为散列函数或散列算法,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合,重新创建一个叫做散列值(hashes)的指纹。散列值通常用一个短的随机字母和数字组成的字符串来代表。好的散列函数在输入域中很少出现散列冲突。 原始数据 --- 输入 --> 哈希函数 --- 输出 --> 数据指纹 一般的, 哈希函数是一种数据转换函数,将输入(原数据)映射成输出(索引) 设.

aaron67的博客 2089

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

哈希表、哈希函数、哈希冲突学习笔记

写在之前 什么是函数? 在中学中,函数被定义为,已知一个数集A,通过特定对应法则,由数集A得到了数集B。我们可以这样理解数集A中的每一个数,经过特定处理,得到了数集B。 函数有三个组成部分,定义域A、值域B和对应法则。 哈希表 哈希表本质上是一个数组,数组的每个位置上储存着键值对(key : value),key是关键字,value是我们想要查找的值,把关键字输入哈希函数,可以得到储存着键值对的下标。 哈希函数 哈希函数也叫散列函数,哈希函数的定义域是所有key值,值域是下标。 哈希函数可以

weixin_41387874的博客 193

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

哈希表/哈希函数_学习笔记

1.什么是哈希表? Hash table 哈希表,可以根据键值(key)直接访问内存存储的数据结构。通过计算函数,将所需要查询的数据映射到表中,映射的这个函数叫哈希函数,存放记录的数组称作哈希表。(哈希表本质就是数组) 数组的查询效率是最高的 2.实现哈希表的两种方法 数组+链表(是解决哈希冲突的一种方法) 数组+二叉树 3.什么是键值key,它是怎么来的 键值key是通过哈希函数处理之后得到的,根据不同的数据特性会采取不同的哈希函数方法来得到键值。 直接地址法 //例如年龄和人口数之.

ZHANjs1999的博客 527

哈希算法(哈希函数)基本

一、什么是哈希(Hash) 哈希也称“散列”函数或“杂凑”函数。它是一个不可逆的单向映射,将任意长度的输入消息M(或文件F)映射成为一个较短的定长哈希值H(M),也叫散列值(HashValue)、杂凑值或消息摘要。可见,这是一种单向密码体制,只有加密过程,没有解密过程(因此Hash求逆很困难)。 二、哈希的原理和特点 单向性:从哈希值不能反向推导原始数据(计算不可行),即从哈希输出无法倒推输入的原始数值。这是哈希函数安全性的基础。 灵敏性:对输入数据敏感,哪怕只改了一个Bit,得到的哈希值也大不相同

长河落日的博客 3万+

计算与数据结构篇 - 哈希算法 (Hash)

计算与数据结构篇 - 哈希算法 (Hash) 哈希算法的定义和原理非常简单,基本上一句话就可以概括了。将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。 构成哈希算法的条件: 从哈希值不能反向推导出原始数据(所以哈希算法也叫单向哈希算法) 对输入数据非常敏感,哪怕原始数据只修改了一个 Bit,最后得到的哈希值也大...

stark张宇 1万+

哈希算法

对于哈希算法,在我们平时的开发中,都是基本上拿来就用就行了,所以这节我们将重点放在如何使用,并不进行哈希算法的原理剖析和如何设计一个哈希算法的讲解. 什么是哈希算法? 将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值(散列值).一个优秀的哈希算法需要满足: 从哈希值不能反向推导出原始数据(所以哈希算法也叫单向哈希算法)...

Tattoo的博客 4万+
上一篇: mysql中的mysql_real_connect连接参数设置
下一篇: 构造函数与拷贝解析
newrain021011
博客等级 码龄22年 17粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值