关于哈希的最通俗的解说

搞IT的,常常面临两个重要问题:存储和查找,包括现在常说的的AI(人工智能),简单说就是算法和大数据的结合,数据的存储和查找就显得尤为重要,对数据的存储和查找的效率往往决定了整个工程的效率。


我们来引出哈希:

比方说,你忘了家里的指甲钳放在哪里了,通常你会在家中所有的抽屉中寻找,直至找到,最坏的情况下,你家里一共有N个抽屉,你就要全部翻一遍这N个抽屉。这种存储方式就叫“数组”,查找方法称为“遍历”

再接着比方,你是一个善于整理的人,家里所有的物品你都有分门别类地整理,然后再放入收纳箱,最后将箱子编号,比如1号箱放的是针线小件,2号箱放的是证件,3号箱放的是细软,4号箱放的是书本。你只需记住编号对应的类别就行,假如哪天你出国需要找到护照,这时你就不要翻开所有抽屉,你直接找到2号箱从中获取即可。这种存储和查找的方式就称为“哈希”,如何对箱子编号,就称为“哈希算法”。

同样是查找,当数据记录量非常大时,差距就非常明显了,假设我们有100亿条数据记录,遍历查找需要最多100亿次,而哈希只需1次。


下面我们来说哈希和哈希算法:

哈希也称散列,哈希表是一种与线性表,树等不同的数据结构,与他们需要不断地遍历比较来查找的方式不同,哈希表设计了一个映射关系:f(key)= address,根据key来存储地址address,这样可以实现1次查找,这里的f函数既是存储数据过程中用来指引数据存储到什么位置的函数,也是将来用来查找这个位置的算法,即哈希算法(哈希函数)

我们举个例子,比如下面这四位人物,我们先按数组存储:

数组存储

当我们要找到大胸姐的电话,就需要遍历查找对比整个数组,第一个是余罪,不是,第二个傅老大也不是,第三个大嫂沈嘉文也不是,直到第四个找到大胸姐。

如果这四人用哈希来存储呢?首先,我们就要设计出适合的哈希算法,教材上说的几种方法,比如:直接定址法,平方取中法,除数取余法等,这几个要是认真细讲起来比较晦涩难懂,这里我们就通俗地说,哈希算法的本质其实就是计算出一个数字。比如我们在此处用取姓名的首字母作为哈希算法就很简单适用。此时有:f(余罪)=y,f(傅老大)=f,f(沈嘉文)=s,f(大胸姐)=d。

构建哈希表如下:

哈希表存储

我们看到他们分别以姓名首字母的位置插入到这一张表中,这样我们就构建了一个Key-Value表格,此表就是哈希表,即Hash Table。这时候当我们要查找余罪的时候,通过计算,余罪在y位置,可以通过1次查找,直接找到这条记录,即手机号。

这个时候有小伙伴就要问了,如果以取首字母为哈希算法的话,在有很多以y为首字母的姓名的情况下怎么办呢,这个时候就不是1次查找了吧,这时候有很多条记录都会映射到一个位置上,也称为哈希冲突。

哈希冲突是跟哈希算法的设计正相关的,设计的算法的随机性越大,那么产生哈希冲突的可能性就越小,在小概率下,如果还有冲突怎么办呢,这个时候就要做一些有损的设计了,比如如果有两个首字母为y的姓名,那么可以接到余罪的后面,当查找的时候,需要先查找到y,然后再顺序查找,如图所示:

哈希冲突

好了,我们总结一下:

首先哈希表是一种数据结构,是一种效率极高的查找方式,哈希表的核心在于哈希算法的设计,哈希冲突了不要紧,我们要增加随机性以及对冲突进行适当的有损化的处理。

其次,在不同高级语言中对哈希的封装和冲突的处理机制都是各不相同各有千秋的,比方说JAVA里面的链表和红黑树互换机制,Redis里面的拉链算法等。本人将在后续的文章中专门讨论对比一下各高级语言中对哈希的封装使用以及冲突的处理。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容

  • 哈希表定义 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结...
    n油炸小朋友阅读 4,842评论 0 22
  • ##什么是哈希表? 哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问...
    莫冰先生阅读 308评论 0 0
  • 缘分这东西 就像太阳雨时的天气 你永远猜不透下一秒 是阳光还是雨滴 索性把喜欢的人儿丢进风里 随蒲公英落地成长
    六孑箫阅读 389评论 0 1
  • 当你凝望深渊的时候,深渊也在凝望你。 从一个不爱表达的人,到不停的表达出内心的幻想,再到不轻易表达,一晃十余年。 ...
    YoU_YU阅读 220评论 0 0
  • 【生而为城】 上海真的是一座繁华又冷漠的城市,有世界各地的人汇聚在此,当然他们并不是为了友好的两国...
    张诺一阅读 314评论 0 1