哈希表又叫做散列表,是一种高效的数据结构,其高效主要体现在把数据的存储和查找时间大大降低,几乎可以看成是常数时间,而代价是消耗比较多的内存,然而在硬件技术越来越发达的今天,用空间换时间的做法在某种意义上是值得的。另外,编码比较容易也是它的特点之一。
什么时候适合应用哈希表呢?综合国内外实际应用情况,可以概括为:高效的数据存储和查找均可以用哈希表。
下面就目前有关哈希表流行的应用做一些初步的探讨。
1、对等网络(P2P)中的应用
a) 基于分布式哈希表的系统
对于对等计算系统而言,能够适应的网络规模是一项非常重要的指标。然而,早期设计的系统,比如 Gnutella 和 Napster,在这方面都有一定的缺陷。前者使用的是不适合大规模系统的洪泛策略,后者引入了集中式的目录管理。
在这样的背景下,一批基于分布式哈希表的系统应时而生,包括 Tapestry[52]、Pastry[40]、Chord[47]和 Content-Addressable Networks (CAN)[39]。在这些系统中,文件根据系统生成的标识(ID)排列。这种标识通常是文件名经过哈希计算的结果。系统中的每一个结点都和一个特定区段内的标识关联,并保存相关联标识对应的文件的信息。当分布式哈希表系统对标识进行查询时,相应的结点便会返回对应的信息。
分布式哈希表系统的核心是路由协议。系统中的分布式哈希表结点构成一个覆盖网,每一个查询操作都是通过这个覆盖网找到目标结点。所以,分布式哈希表系统的性能就取决于其所采用的路由协议的效率。虽然各种分布式哈希表系统的路由协议都不相同,但它们都具有一个共同的特点,就是每一个结点在覆盖网中拥有的邻居数目为 O( LogN ) 1 ,完成每一次路由所需步数都会在O( LogN ) 内,其中 N 为系统总结点数。
b)基于分布式哈希表的关键词搜索
结构化对等计算网络都实现了分布式哈希表,并利用分布式哈希表将数据项映射到结点。上层应用可以插入一对<key, value="">到系统中,并通过 key 得到 value,哈希表在EJB中用的较多,简单的聊天室中可以靠Hash表来维持用户的数据。
2、用哈希函数压缩序数索引
在数学上将这种n位数转换为m(其中m<n< font="">)位数称为哈希转换(hashing)。哈希转换可以将一个索引器空间(indexers space)转换为哈希表(hash table)。哈希函数实现哈希转换。以社保号的例子来说,哈希函数H()表示为:H(x) = x 的后四位,哈希函数的输入可以是任意的九位社保号,而结果则是社保号的后四位数字。
数学术语中,这种将九位数转换为四位数的方法称为哈希元素映射,显然映射未必全是单设,这必将导致冲突的产生 ,处理冲突的相关机制不是本文探讨范围。
3、信息安全方面的应用
a)攻击路径重构
在路由器上利用哈希表记录IP报文头部信息,实现攻击路径的重构,从而追踪到攻击主机的地址。
出现的问题:1、瞬时攻击和追踪中,该方法不是适合源主机和目标主机之间跳数太多的网络。2、更新路由器或增大内存导致硬件成本提高
b)在信息加密方面的应用
利用哈希函数的非单射构造不可逆的加密算法,从而实现信息的安全传输。
4、数据库中的数据查找
由于它在记录查找时一次存取便能得到所查记录,所以在电信领域中对大型话单文件进行处理时,显示相当高的效率。例如:广东电信公用电话200话单处理中利用哈希表实现了话单统计。
由以上总结可知,哈希表的应用非常广泛。