哈希算法,2次不同的输入有没有可能产生相同值(万一巧合相同)(哈希值可能重复吗)

互联网- 2023-08-09 21:10:53

哈希算法的介绍

本篇文章给大家谈谈哈希算法,2次不同的输入有没有可能产生相同值(万一巧合相同),以及哈希表冲突的解决办法对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

本文目录

  1. 哈希算法,2次不同的输入有没有可能产生相同值(万一巧合相同)
  2. 如何理解哈希表的工作原理
  3. 什么是哈希表呢
  4. 哈组是什么

哈希算法,2次不同的输入有没有可能产生相同值(万一巧合相同)

可能的,因为哈希的原理就是抽样,取信息的特征。而实际的哈希表,全部都要处理哈希值冲突的情况。

如何理解哈希表的工作原理

哈希表是根据关键值(key)来直接访问目标值(value)的一种数据结构。其特点就在于能够快捷的实现信息的查询和检索。

比如我们在手机中存放的通讯录就是用哈希表来实现的,即我们输入一个联系人的姓名,就能返回相应的电话号码。用哈希表实现的过程就是,将联系人姓名的字符通过一个哈希函数,映射成一个整数(哈希码),然后根据哈希码来索引出电话号码。比如哈希码为5,就表示是在存储位置为5,因此我们就能直接取出该位置的值,并返回结果。

那么实现哈希表的关键就在于哈希函数的构建,也就是如何建立一个合适的索引来满足如下条件:

1)同一个键每次输入到哈希函数中,其对应的哈希码也必须相同;

2)不同键对应的哈希码不能相同。

第一个条件意味着哈希函数必须是确定性的;第二个条件则要求不能出现哈希冲突。当两个或更多个键产生相同的哈希码时就会发生冲突(hashcollisions)。

比如我们现在考虑建立一个简单的哈希表来查询年龄,{Jim:5,Davis:7,Taylor:12,Bob:3},如果我们选择哈希函数为输入键值的字符个数。那么在建立哈希表时,就讲Jim存放在位置3处,Jack存放在位置4处。而这样的话Jim和Bob的存储位置就会发生冲突,不符合哈希函数的要求。但是如果我们将哈希函数替换为首字母顺序存放,在这个数据中就没有哈希冲突了。

然而万一无法避免哈希冲突的话,我们可以用链接和线性探测的方法来避免哈希值发生碰撞。

链接就是将发生冲突的键值直接链接在链表的尾部;线性探测则是,如果在位置i处发生冲突,那么就检查i+1处是否为空,为空的话就将冲突键值放入其中,否则继续检查下一个。

什么是哈希表呢

简单说就是按照哈希函数关系建立的表具体内容请参考数据结构相关知识~下面引用一些别的地方

1基本原理我们使用一个下标范围比较大的数组来存储元素。可以设计一个函数(哈希函数),使得每个元素的关键字都与一个函数值(即数组下标)相对应,于是用这个数组单元来存储这个元素;也可以简单的理解为,按照关键字为每一个元素"分类",然后将这个元素存储在相应"类"所对应的地方。但是,不能够保证每个元素的关键字与函数值是一一对应的,因此极有可能出现对于不同的元素,却计算出了相同的函数值,这样就产生了"冲突",换句话说,就是把不同的元素分在了相同的"类"之中。后面我们将看到一种解决"冲突"的简便做法。总的来说,"直接定址"与"解决冲突"是哈希表的两大特点。

2函数构造构造函数的常用方法(下面为了叙述简洁,设h(k)表示关键字为k的元素所对应的函数值):a)除余法:选择一个适当的正整数p,令h(k)=kmodp这里,p如果选取的是比较大的素数,效果比较好。而且此法非常容易实现,因此是最常用的方法。b)数字选择法:如果关键字的位数比较多,超过长整型范围而无法直接运算,可以选择其中数字分布比较均匀的若干位,所组成的新的值作为关键字或者直接作为函数值。

3冲突处理线性重新散列技术易于实现且可以较好的达到目的。令数组元素个数为S,则当h(k)已经存储了元素的时候,依次探查(h(k)+i)modS,i=1,2,3……,直到找到空的存储单元为止(或者从头到尾扫描一圈仍未发现空单元,这就是哈希表已经满了,发生了错误。当然这是可以通过扩大数组范围避免的)。

4支持运算哈希表支持的运算主要有:初始化(makenull)、哈希函数值的运算(h(x))、插入元素(insert)、查找元素(member)。设插入的元素的关键字为x,A为存储的数组。初始化比较容易,例如constempty=maxlongint;//用非常大的整数代表这个位置没有存储元素p=9997;//表的大小proceduremakenull;vari:integer;beginfori:=0top-1doA[i]:=empty;End;哈希函数值的运算根据函数的不同而变化,例如除余法的一个例子:functionh(x:longint):Integer;beginh:=xmodp;end;我们注意到,插入和查找首先都需要对这个元素定位,即如果这个元素若存在,它应该存储在什么位置,因此加入一个定位的函数locatefunctionlocate(x:longint):integer;varorig,i:integer;beginorig:=h(x);i:=0;while(i<S)and(A[(orig+i)modS]<>x)and(A[(orig+i)modS]<>empty)doinc(i);//当这个循环停下来时,要么找到一个空的存储单元,要么找到这个元//素存储的单元,要么表已经满了locate:=(orig+i)modS;end;插入元素procedureinsert(x:longint);varposi:integer;beginposi:=locate(x);//定位函数的返回值ifA[posi]=emptythenA[posi]:=xelseerror;//error即为发生了错误,当然这是可以避免的end;查找元素是否已经在表中proceduremember(x:longint):boolean;varposi:integer;beginposi:=locate(x);ifA[posi]=xthenmember:=trueelsemember:=false;end;这些就是建立在哈希表上的常用基本运算。

哈组是什么

哈组是指哈希表中的一个组,其内部包含了多个键值对。原因是在哈希表中,为了解决冲突问题,采用了哈希函数对键进行散列,从而将键值对存储在不同的位置上,而每个位置则对应一个组。哈组的实现可以采用链表或树等数据结构。在哈希表中查找或插入元素时,需要先根据哈希函数计算键值的索引,然后在相应的哈组中查找或插入元素,从而实现高效的存取操作。

文章分享结束,哈希算法,2次不同的输入有没有可能产生相同值(万一巧合相同)和哈希表冲突的解决办法的答案你都知道了吗?欢迎再次光临本站哦!

混进iOS 14.3 网友爆出苹果CSAM检测技术出现哈希冲突
  • 声明:本文内容来自互联网不代表本站观点,转载请注明出处:bk.66688815.com/11/89791.html
上一篇:吸烟的好处和坏处有哪些(吸烟的五大好处五大坏处)
下一篇:哈工程因学费困难怎么办(哈尔滨工程大学学费代偿)
相关文章
返回顶部小火箭