关于hash

原创 2002年03月22日 17:40:00

简单来说,hash就是找到一种数据内容和数据存放地址之间的映射关系。比如,由若干字符串要存放到一个哈西表中,希望能够在O(1)的时间内在表中定位某个特定的字符串,我们可以用数组来实现哈西表,找到某种函数sting -> integer,记为 p = f(s),其中p是一个整数,s是一个字符串,p就是字符串s在数组中的下标。这样如果需要在数组中定位s,只要直接根据函数p=f(s)就可以计算s的位置。在哈西表中添加一个字符串也类似,根据字符串的值计算出其应该存放在数组中的位置,然后将字符串放入。但是这种函数(成为哈西函数)很难找,找到一个一一对应的函数几乎不可能,所以经常采用非一一对应的哈西函数。比如对于上面的例子,我们可以设计一个简单的哈西函数,我们设f(s)定义为s的各个字符的Ascii码的和除以n的余数,这里n是我们的数组的长度,我们假设了哈西表中最多需要存储n个元素。但是这个哈西函数有个显而易见的缺点,比如对于字符串s1= "abc"和s2="acb",显然计算出来的哈西函数值都是一样的,但是一个位置上只能存放一个元素,如果先将s1放入哈西表的位置p1,再将s2放入哈西表,这时候因为计算出p2=f(s2) = p1,所以s2应该放置的位置已经被s1占据了,所以就出现了麻烦。这就叫做“冲突”。解决这个冲突的一个简单的办法是,因为p1已经被s1占据,我们就看p1+1,如果该位置为空,则放入s2,否则继续看p1+2,……一直找到一个空位。假设我们将s2放在p1+1,但是这时候要加入s3,而f(s3)恰好等于p1+1,s3的位置又被s2占据了,我们可以继续看p1+2,p1+3……是否为空,直到找到一个空位放入s3,依此类推。在查找s2的时候,我们先根据f(s2)计算出s2应该在p1位置上,然后我们看p1位置上的元素,发现不是s2(该位置上是s1),于是我们继续看p1+1,p1+2,……一直到找到s2,或者到表尾,或者发现一个空位就可以中止了,后两种情况表示s2不在表中。显而易见,如果冲突发生的太多的话,哈西表的效率会下降。事实上我刚才举的例子中的哈西函数很不好,所以冲突发生的可能性很大。如果找一个比较好的哈西函数,哈西表的效率还是很高的。至于找哈西函数的方法,要根据具体的数据类型和应用场合来分析,也有一些原则,这里就不一一介绍了~~

取模运算与hash function

取模运算常常对应于hash散列; 错误的 m,常得到错误的hash散列, 错误的hash散列,则无法达到选取hash散列的目的;...
  • lanchunhui
  • lanchunhui
  • 2016年01月24日 15:55
  • 712

关于区块链那些事(用Python3体现)

要弄懂什么是区块链技术的前提,首先要知道什么是md5算法。给一个最简单的md5解释:任何一个存在着的不发生变化的事物都有其一个固定不变的md5编码。这个md5编码组成内容很简单,就是0-9的数字和a-...
  • yunlimengliwuli
  • yunlimengliwuli
  • 2018年01月10日 19:07
  • 60

关于Hash

 这两周在写与Hash有关的代码,实在是Hash了一把.通过这几天的研究,还颇有心得,值得深入下去.对代码的算法的时间复杂度,运行效率进行很多方面的测试,感觉还好,终于可以对这段时期的研发告一段落.有...
  • QQ5460QQ
  • QQ5460QQ
  • 2006年12月27日 23:27
  • 537

哈希、HashMap原理及源码、Hash的一些应用面试题

Hash,一般翻译做“散列”,也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是...
  • paincupid
  • paincupid
  • 2015年08月14日 23:20
  • 3980

哈希之详细介绍

(1)散列表(哈希表)的定义 目录(?)[+] 一般的查找 给你一个顺序表,你会如何查找某个给定的元素? 一般思路就是从表头开始,一个挨一个的比较记录a[i]与key的值是“=”...
  • u013058160
  • u013058160
  • 2015年01月18日 16:07
  • 824

关于hash质数

最近我在做一个项目,其中要用到一个数据结构——Hash Table(哈希表),以前只有理论知识,现在实却发现很不简单,所以写下来和大家共分享。 我们知道,哈希表是一个固定大小的数组,数组的每个元...
  • thy0311
  • thy0311
  • 2014年10月31日 16:06
  • 197

关于HASH和MD5

看来很多人对Hash算法还不是很理解。在这里,我简单的讲解一下。 我也不在希望以后再有人问关于MD5,SHA1如何解密了! 首先简单的讲一下Hash算法和他的通途!可能大家看了以后,很多人可能都会...
  • hemeinvyiqiluoben
  • hemeinvyiqiluoben
  • 2013年10月21日 21:18
  • 400

关于Hash的总结

hash函数   hash函数常用的是mod 素数,或者使用乘法策略,取某些位,这些策略直接影响到hash table的resize,如果是mod素数的话,只能按素数来递增,如果是取乘法方法,只能以...
  • bertzhang
  • bertzhang
  • 2012年02月27日 14:22
  • 1054

关于HASH分区

上次参加oracle的培训,老师讲到了利用10g智能分区匹配可以极大地提高两个分区表的连接速度,对于这两个分区的要求就是必须采用相同的分区策略,最简单的实现就是两个分区表都采用HASH分区,并且HAS...
  • oratea
  • oratea
  • 2014年01月26日 09:48
  • 740

Apache中的哈希表剖析(2)

转载请注明来源:http://blog.csdn.net/tingya3.4.3数据插入和获取    对于哈希表而言,一个重要的任务就是插入key/value数据以及根据键值获取相应的值。APR中定义...
  • tingya
  • tingya
  • 2006年03月05日 10:46
  • 3866
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于hash
举报原因:
原因补充:

(最多只允许输入30个字)