«September 2025»
123456
78910111213
14151617181920
21222324252627
282930


公告
 

上善若水 厚德载物


我的分类(专题)

首页(2340)
幽你一默(198)
美食与健康(55)
English(832)
文学欣赏(76)
计算机应用(694)
音乐(120)
小知识(235)
修身养性(289)
相关下载(10)


最新日志
七天养成一个好习惯,52个星期后你就会脱
TOP TEN RULES TO BAG
到了才知道~
给更重要的事留出更多时间
那些最熟悉的“陌生”词
一个好男人一生中要处理好七件事:
Heart to Heart
10招教你应对粗鲁的人
10个小细节 平凡的我们也能改变世界
毕业生为何都要穿学位服
六字英文微小说:言有尽意无穷
Education
用26个英文字母概括80后的生存原则
2014年巴西世界杯主题曲《We Are
年轻的求职者都会犯的10个错
屁话自有屁用
15大信号 在我们身边的都是好朋友
人生是一场相逢,又是一场遗忘
各国简介中英互译
7 cardinal rules in

最新回复
回复:TOP TEN RULES TO 
回复:“我挺你”的10种英文表达
回复:啥样的身体才叫健康
回复:啥样的身体才叫健康
回复:sorry不是随便就能说的
回复:【蜗牛机型专用】风林火山 GHOS
回复:有些人
回复:和英国人交流要小心
回复:野火烧不尽 春风吹又生——解读白居
回复:英语最常用5000单词【英英注释】
回复:[收藏]色拉英语乐园教材[下载]
回复:英语最常用5000单词【英英注释】
回复:英语最常用5000单词【英英注释】
回复:英语最常用5000单词【英英注释】
回复:古人咏叹中秋的经典诗句
回复:[收藏]原子分析英语词根 2006
回复:[收藏]色拉英语乐园教材[下载]
回复:美国独立日
回复:嘴边最COOL的英语
回复:中国古代四大才女

留言板
签写新留言

牛年牛一把
牛年快乐
hello
分享
感谢
因为距离所以美丽
您的子域名已开通。

统计
blog名称:宁静致远
日志总数:2340
评论数量:2658
留言数量:88
访问次数:17528121
建立时间:2004年11月1日

链接




本站首页    管理页面    写新日志    退出

[小知识]什么是HASH
hjx_221 发表于 2009/4/19 13:17:04

什么是HASH     在memcached中,我们一直提到key的hash来存取数据,为了更好的理解存取数据的过程。我们先来理解一下hash,即叫散列或者哈希。      google搜索到的头条:散列表(也叫哈希表),是根据关键码值直接进行访问的数据结构,也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。    我觉得这个解释太含糊,想要整明白哈希表,那就得明白哈希表到底有什么样的优势。    数据结构中,有个时间算法复杂度O(n)的概念来衡量某种算法在时间效率上的优劣。哈希表的理想算法复杂度为O(1),也就是说利用哈希表查找某个值,系统所使用的时间在理想情况下为定值,这就是它的优势。那么哈希表是如何做到这一点的呢?    我们定义一个很大的有序数组,想要得到位于该数组第n个位置的值,它的算法复杂度为O(1)。哈希表利用哈希函数将需要存储的内容的关键值转换为这个有序 数组中的某个值,在被存储内容和有序数组之间建立了映射关系。这样,下次我们对这个值进行查找时只要使用同一个哈希函数对关键值进行转换,找到这个数组值 就可以了。     如果还没有明白是怎么回事的话,那我们来举个例子。假设我们要做个存储结构,需要存储下来三国中的人物,以及他们的详细信息。我们用他们的名字来作为存储 的关键值,例如:刘备,曹操,孙权,关羽,张飞……等等。这个时候我们如果想用一般的方法来查找这些英雄豪杰,需要遍历整个存储空间,如果这些英雄豪杰一 共有n个,那么这时候的时间算法复杂度为O(n)。显然如果n值很大,每次想要找到某个英雄就需要比较长的时间。     此时我们先定义一个大的有序结构数组HashValue[m],用来存放各位英雄豪杰的信息。然后编写一个哈希函数ChangeToHashValue (name),函数的具体内容就不细说了,反正这个函数会将这些做为关键值的名字转换为HashValue[m]中的某个下标值x。然后可以将英雄的信息 放进HashValue[x]中去。这样,可以将所有英雄的信息存储起来。当查询的时候再使用哈希函数ChangeToHashValue(name)得 到这个下标值,这样就很容易得到了这个英雄的信息。例如:ChangeToHashValue(刘备)为10,那么就将刘备存储到HashValue [10]里面。当查询的时候再次使用ChangeToHashValue(刘备)得到10,这个时候我们就可以很容易找到刘备的所有信息。在实际应用中如 果我们想把所有的英雄豪杰都存储进系统时,需要定义m>n。就是数组的大小要大于需要存储的信息量,所以说哈希表是一个以空间换取时间的数据结构。    这个时候问题来了,出现了这种情况ChangeToHashValue(关羽)和ChangeToHashValue(张飞)得到的值是一样的,都是 250,我们岂不是在存储过程中会遇到麻烦,怎么安排他们二位的地方呢(总不能让二位打一架,谁赢了谁呆在那吧),这就需要一个解决冲突的方法。当遇到这 种情况时我们可以这样处理,先存储好了关羽,当张飞进入系统时会发现关羽已经是250了,那咱就加一位,251得了,这不就解决了。我们查找张飞的时候也 是,一看250不是张飞,那就加个1,就找到了。这时还存在一个问题。直接用ChangeToHashValue(赵云)为251,张飞已经早早占了他的 地方,那就再加1存到252呗。呵呵,这时我们会发现,当哈希函数冲突发生的机率很高时,可能会有一群英雄豪杰在250这个值后面扎堆排队。要命的是查找 的时候,时间算法复杂度早已不是O(1)了(所以我们说理想情况下哈希表的时间算法复杂度为O(1))。          这就是说哈希函数的编写是哈希表的一个关键问题,会涉及到一个存储值在哈希表中的统计分布。如果哈希函数已经定义好了,冲突的解决就成为了改变系统性能的 关键因素。其实还有很多种方法来解决冲突情况下的存储和查找问题,不一定非要线性向后排队,如果有好的哈希表冲突的解决方法也能很大程度上提高系统的效 率。

阅读全文(5076) | 回复(5) | 编辑 | 精华

回复:什么是HASH
小工头发表评论于2009/4/19 23:41:34

补充一下,目前常用的Hash算法有MD5和SHA1两种,不过都已经被发现造成冲突的手段。将来用的hash算法包括SHA256、SHA384、SHA512等等 以下为blog主人的回复:  谢谢小工头!!

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除

回复:什么是HASH
山东(游客)发表评论于2010/11/29 18:07:31

暗示
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除

回复:什么是HASH
山东(游客)发表评论于2010/11/29 18:08:32

暗示
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除

» 1 »

发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)
站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.094 second(s), page refreshed 144783691 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号