纸上谈兵: 哈希表 (hash table)

  • 时间:
  • 浏览:0
  • 来源:幸运快3_快3平台代理_幸运快3平台代理

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

HASH

哈希表(hash table)是从一一一另另一个集合A到从前 集合B的映射(mapping)。映射是这种对应关系,但会 集合A的某个元素非要对应集合B中的一一一另另一个元素。但反过来,集合B中的一一一另另一个元素将会对应多个集合A中的元素。将会B中的元素非要对应A中的一一一另另一个元素,从前 的映射被称为一一映射。从前 的对应关系在现实生活中很常见,比如:

-> B

-> 身份证号

日期 -> 星座

后边一一另另一个映射中, -> 身份证号一一映射的关系。在哈希表中,上述对应过程称为hashing。A中元素a对应B中元素b,a被称为键值(key),b被称为a的hash值(hash value)

 韦小宝的hash值

映射在数学上合适一一一另另一个函数f(x):A->B。比如 f(x) = 3x + 2。哈希表的核心是一一一另另一个哈希函数(hash function),这种 函数规定了集合A中的元素如保对应到集合B中的元素。比如:

A: 三位整数    hash(x) = x % 10    B: 一位整数

104                               4

876                               6

192                               2

上述对应中,哈希函数表示为hash(x) = x % 10。也统统 说,给一一一另另一个三位数,我们都都取它的最后一位作为该三位数的hash值。

哈希表在计算机科学中应用广泛。比如:

Ethernet中的FCS:参看小喇叭始于了了英语 广播 (以太网与WiFi协议)

IP协议中的checksum:参看我尽力 (IP协议详解)

git中的hash值:参看版本管理三国志

上述应用中,我们都都用一一一另另一个hash值来代表键值。比如在git中,文件内容为键值,并用SHA算法作为hash function,将文件内容对应为固定长度的字符串(hash值)。将会文件内容所处变化,都这么所对应的字符串就会所处变化。git通过比较较短的hash值,就不能知道文件内容是否是所处变动。

再比如计算机的登陆密码,一般是一串字符。然而,为了安全起见,计算机不不直接保存该字符串,统统 保存该字符串的hash值(使用MD5、SHA将会但会 算法作为hash函数)。当用户下次登陆的事先,输入密码字符串。将会该密码字符串的hash值与保存的hash值一致,都这么就认为用户输入了正确的密码。从前 ,就算黑客闯入了数据库中的密码记录,他能看得人的也统统 密码的hash值。后边所使用的hash函数有很好的单向性:太难从hash值去推测键值。但会 ,黑客无法获知用户的密码。

(事先有报道多家网站用户密码泄露的时间,统统 将会哪几个网站存储明文密码,而是否是hash值,见多家网站卷入CSDN泄密事件 明文密码成争议焦点)

注意,hash若果求从A到B的对应为一一一另另一个映射,它并都这么限定该对应关系为一一映射。但会 会有从前 的将会:一一另另一个不同的键值对应同一一一另另一个hash值。这种 情况表叫做hash碰撞(hash collision)。比如网络协议中的checksum就将会再次出现这种 情况表,即所要校验的内容与原文无须同,但与原文生成的checksum(hash值)相同。再比如,MD5算法常用来计算密码的hash值。将会有实验表明,MD5算法有将会所处碰撞,也统统 不同的明文密码生成相同的hash值,这将给系统带来很大的安全漏洞。(参考hash collision)

HASH与搜索

hash表被广泛的用于搜索。设定集合A为搜索对象,集合B为存储位置,利用hash函数将搜索对象与存储位置对应起来。从前 ,我们都都就不能通过一次hash,将对象所在位置找到。这种常见的情况表是,将集合B设定在数组下标。将会数组不能根据数组下标进行随机存取(random access,算法冗杂度为1),统统 搜索操作将取决于hash函数的冗杂程度。

比如我们都都以人名(字符串)为键值,以数组下标为hash值。每个数组元素中存储有一一一另另一个指针,指向记录 (人们名和电话号码)。

下面是一一一另另一个简单的hash函数:

#define HASHSIZE 11507

/* By Vamei * hash function */ int hash(char *p) { int value=0; while((*p) != '\0') { value = value + (int) (*p); // convert char to int, and sum p++; } return (value % HASHSIZE); // won's exceed HASHSIZE }

hash value of "Vamei": 498

hash value of "Obama": 4150

我们都都不能建立一一一另另一个HASHSIZE大小的数组records,用于储存记录。HASHSIZE被选着为质数,以便hash值能更加均匀的分布。在搜索"Vamei"的记录时,不能经过hash,得到hash值498,再直接读取records[498],就不能读取记录了。

(666666是Obama的电话号码,111111是Vamei的电话号码。纯属杜撰,请勿当真)

hash搜索

将会不采用hash,而统统 在一一一另另一个数组中搜索的话,我们都都需要依次访问每个记录,直到找到目标记录,算法冗杂度为n。我们都都不能考虑一下为哪几个会有从前 的差别。数组确实不能随机读取,但数组下标是随机的,它与元素值都这么任何关系,统统 我们都是否是是逐次访问各个元素。通过hash函数,我们都都限定了每个下标位置将会存储的元素。从前 ,我们都都利用键值和hash函数,就不能具备相当的先验知识,来选着适当的下标进行搜索。在都这么hash碰撞的前提下,我们都都只需要选着一次,就不能保证该下标指向的元素是我们都都我想要的元素。

冲突

hash函数需要正确处理hash冲突的大难题。比如,后边的hash函数中,"Obama"和"Oaamb"有相同的hash值,所处冲突。我们都都如保正确处理呢?

一一一另另一个方案是将所处冲突的记录用链表储存起来,让hash值指向该链表,这叫做open hashing:

open hashing

我们都是否是是搜索的事先,先根据hash值找到链表,再根据key值遍历搜索链表,直到找到记录。我们都都不能用但会 数据价值形式代替链表。

open hashing需要使用指针。我们都是否是是事先我想要正确处理使用指针,以保持随机存储的优势,统统 采用closed hashing的最好的土最好的办法来正确处理冲突。

closed hashing

这种 情况表下,我们都都将记录上放去数组。当有冲突再次出现的事先,我们都都将冲突记录上放去数组中依然闲置的位置,比如图中Obama被插入后,随后的Oaamb也被hash到4150位置。但将会4150被所处,Oaamb探测到下一一一另另一个闲置位置(通过将hash值加1),并记录。

closed hashing的关键在如保探测下一一一另另一个位置。后边是将hash值加1。但也可是否是其它的最好的土最好的办法。概括的说,在第i次的事先,我们都都应该探测POSITION(i)=(h(x) + f(i)) % HASHSIZE的位置。后边将hash值加1的最好的土最好的办法,就合适设定f(i) = 1我们都是否是是搜索的事先,就不能利用POSITION(i),依次探测记录将会再次出现的位置,直到找到记录。

(f(i)的选着会带来不同的结果,这里不再深入)

将会数组比较满,都这么closed hashing需要进行但会 次探测不能找到空位。从前 将大大减小插入和搜索的效率。这种 情况表下,需要增大HASHSIZE,并将从前 的记录上放去到新的比较大的数组中。从前 的操作称为rehashing

总结

hash表,搜索

hash冲突, open hashing, closed hashing

欢迎继续阅读“纸上谈兵: 算法与数据价值形式”系列。

猜你喜欢

对话阿里张勇:双11不为交易数字,我十年从不做预期

阿里巴巴天猫双11于今日夜里正式打响。晚上22点28分,成交额突破1150亿元。与此同時 ,阿里巴巴CEO张勇接受了新浪科技采访。张勇指出,双11所以我走过10年,他对总交易

2020-01-23

V. Kernstock数据,V. Kernstock新闻,V. Kernstock视频,V. Kernstock身价

V.KernstockV.Kernstock俱乐部:特尔福斯国籍:奥地利身高:CM位置:前锋年龄:17岁体重:KG号码:号生日:5002-08-06惯用脚:相关队员前锋进球国籍

2020-01-23

上线送满v传奇游戏盒子最新下载

上线送满v传奇游戏盒子是一款最新好玩的游戏软件平台,由创游科技倾力打造的游戏下载应用平台,在这里我就到最新、最火爆的BT游戏,然后上线即送满VIP、免费0元GM特权服,豪华游戏

2020-01-23

古代文人多有雅号,而原因固不止一端!

核心提示:古代文人多有雅号,而雅号的得名,因为着固不止一端。有因所从事的职业而得名的。计有功在《唐诗纪事》中说,胡令能“少为负局钉铰之业”,也否则 否则 用铆钉把破损的锅碗

2020-01-23

肾癌治疗的微创革命/养和医院泌尿外科部副主任 陈伟希医生

图:手术治肾癌较這個治疗最好的措施有效肾癌并全是香港最常见的癌病,每年约有接近七百宗新症及二百例死亡,男性患病率比女人爱多一倍。肾脏经常出现癌病的次要都还里能 离米 分为肾

2020-01-23