Hash算法原理及在快速检索中的应用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

156
福建电脑
2009 年第 11 期
上网使用的累计流量进行计费。 学校出口带宽 100M,平均每秒 通过计费系统的数据包个数约为 100000 个,统计方式为获取每 个数据包的 IP 地址和包大小, 将 包 大 小 值 累 加 到 该 IP 对 应 的 数据表项中。 校园内 IP 地址的 范 围 随 机 , 上 网 的 IP 总 数 量 在 10000 个以内。 要求设计一个合理的算法来快速统计流量。 2.2 分析:
在传统的线性表、各类树结构中,每个记录在存储结构中 的相对位置是随机的,即使进行了排序,仍然无法从某个记录的 关键字中直接判断出该记录在存储结构中的位置。 因此在存储 结构中要检索某一记录时, 需要对结构中每一项的关键字进行 比较。 这类基于"比较"的检索方式,其执行效率与需要进行比较 的次数直接相关。
在检索的过程中,关键字的比较次数,取决于产生冲突的多 少,产生的冲突少,检索效率就高,反之亦然。 因此,影响产生冲 突多少的因素,也就是影响检索效率的因素。 影响产生冲突多少 有以下三个因素:
1. Hash 函 数 的 Hash 结 果 是 否 均 匀 ,Hash 函 数 越 均 匀 ,产 生冲突的概率就越小,Hash 表的检索性能就越好;
4. 公共溢出区法:建立一个公共溢出区,当发生碰撞时到公 共溢出区检索记录。 1.4 Hash 表检索的性能分析
Hash 表的检索过程就是利用 Hash 函数对 关 键 字 进 行 转 换 找到记录的过程。 当不同关键字的 Hash 地址发生冲突时,就需 要利用冲突处理方法进行检索。 在前面介绍的冲突处理方法中, 产 生 冲 突 后 的 检 索 仍 然 是 利 用 给 定 值 与 Hash 地 址 所 在 记 录 的 关键字进行比较的过程。 所以,对散列表检索效率的分析,使用 平均比较次数来衡量。
int Hash(u_char *key) { unsigned long h=0;
h = (key[0]+key[2])*256+key[1]+key[3];
return h%65536; } 2.4 优化结果: 根据上述分析及 Hash 算法、 表空间、 冲突处理方式的设 计 ,能 够 使 得 校 园 网 IP 流 量 统 计 表 实 现 O(1)性 能 的 查 询 、统 计 能力,相对于使用线性表存储的方式,即节约了排序时间,又使 每秒需要进行 1300000 次比对查找才能够完成的计费统计过程 提升到只进行 100000 比对查找就能够完成,实现了系统性能的 大幅度提升。 3. 结束语 Hash 算 法 是 一 种 解 决 大 容 量 数 据 表 快 速 检 索 的 一 种 简 单 高效的方法,在需要进行大量检索操作的领域,有其非常重要的 作用和地位。
【关键词】: 哈希;快速排序;HASH;散列
引言
Hash,可以翻译成"散列"的,也可直译为"哈希"。 Hash 算法 可以把任意长度的输入变换成固定长度的输出, 该输出值称为 Hash 值 。 Hash 表 是 利 用 Hash 算 法 和 Hash 值 进 行 直 接 寻 址 定 位 的 数 组 结 构 ,可 以 在 O(1)的 时 间 复 杂 度 内 访 问 表 内 的 任 意 元 素 ,因 此 在 需 要 频 繁 进 行 检 索 定 位 的 情 况 下 ,利 用 Hash 表 能 够 极大地提升检索的性能。 1.Hash 算法原理及 Hash 表数据结构 1.1 Hash 表与 Hash 函数
1. 直 接 寻 址 法 : 取 关 键 字 或 关 键 字 的 某 个 线 性 函 数 值 为 Hash 函数。
2. 数字分析法: 数字分析法是取关键字中某些取值较分散 的数字位作为 Hash 地址的方法。
3. 平方取中法: 平分取中法是取关键字平方的中间几位作 为 Hash 地址的方法,具体取多少位视实际要求而定。
Hash 函数往往都难以避免冲突,因此针对实际应用及 Hash 函数的特点,选择合适的冲突处理方法就显得尤为重要,常用的 冲突处理方法有:
1. 开 放 寻 址 法 :当 发 生 冲 突 时 ,沿 着 Hash 地 址 向 下 按 一 定 增量寻找下一地址,判断是否仍然冲突,如仍然冲突,继续按同 一增量寻找下一地址。
2. 再 Hash 法 : 在 产 生 地 址 冲 突 时 对 关 键 字 计 算 另 一 个 Hash 函数地址,直到冲突不再发生。
3. 链 接 法 :每 一 个 Hash 地 址 都 为 一 动 态 链 表 ,无 冲 突 时 只 有 一 个 项 ,当 发 生 冲 突 时 ,动 态 为 这 个 Hash 地 址 对 应 的 表 项 增 加一个子项。
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
(上接第 174 页)
2.3 远程虚拟电子实验室系统的交互过程 如图 3 所示, 远程虚拟电子实验室的具体交互过程如下:
远程用户(即客户端)通过浏览器访问本实验室,进入远程虚拟电 子实验室系统网站的登录页面。 由浏览器以表单形式向认乞 b 服 务 器 提 交 登 录 请 求 ,Web 服 务 器 运 行 AsP 应 用 程 序 , 并 从 Acces 数据库中获取该用户相关信息,检测该用户是否为合法用 户。 只有合法用户通过认飞 b 服务器身份验证后,才能进入实验 室系统,进行远程实验操作。
参考文献: 1. 汪诗林、 孙晓东等译.《数据结构的中文全 称 是 数 据 结 构 、 算 法 与 应 用--C++ 语 言 描 述 》[M]. 北 京 :机 械 工 业 出 版 社 ,2009. 2.潘金贵,顾铁成,李成法 译《算法导论》[M].北京:机械工业出版社,2008. 3.Donald E.Knuth 著.《The Art of Computer Programming》[M]. 北 京 :机 械 工 业 出 版 社 ,2008
4. 折叠法:先将关键字分割成位数相同的几段,然后将他们 叠加求和作为 Hash 地址的方法。
5. 随机数法:当关键字不等长时,可取关键字的某个伪随机 函数值作为哈希地址。
6. 除留余数法:取关键字被某个不大于 散 列 表 表 长 m 的 数 p 除后所得的余数为散列地址。 即 H(key) = key MOD p, p<=m。
检索的理想情况是能够根据关键字直接找到需要的记录, 即每一个记录的关键字都与存储结构中的某一位置唯一对应, 且 存 在 对 应 关 系 f,使 关 键 字 K 的 存 储 位 置 为 f(K),则 在 进 行 检 索时,只需要根据关键字 K 和对应关系 f,既可以查找到需要的 记录。 这个对应关系 f 称之为 Hash 函数,根据这 一 思 想 建 立 的 表 称 为 Hash 表 (也 称 散 列 表 、哈 希 表 )。 在 理 想 情 况 下 (无 冲 突 时),Hash 表的检索性能为 O(1)。 1.2 冲突与冲突处理
优化的目标: · 新增 IP 不需要进行排序。 · 达到 O(1)的检索性能。 根据优化目标, 我们采用 Hash 表来进行存储, 根据上文 HASH 查找的性能分析中可知,为了提升查找性能,可以 适 当 增 加表空间,降低散列表的装填因子,合理设计散列函数,使散列 函数尽可能均匀,并选用合适的冲突处理方法。 1. 确 定 Hash 地 址 空 间 :IP 地 址 的 显 示 格 式 为 XXX.XXX. XXX.XXX,而在网络数据包中,IP 地址是以一 个 32 位 无 符 号 整 形 数 存 储 的 ,其 共 有 4294967296 种 可 能 ,考 虑 到 校 园 网 内 的 IP 数 量 不 超 过 10000 个 ,为 了 快 速 地 进 行 Hash 运 算 ,并 通 过 适 当 提高散列值地址范围来减少上列表的装填因子,可以将 Hash 后 的散列值定为 16 位,即将 IP 地址进行 Hash 运算后的散列值分 布在 0~65535 之间。 2.确 定 表 空 间 :由 于 校 园 网 内 IP 数 在 10000 以 内 ,IP 地 址 散列值为 16 位,则表空间大小为 65536 项。 3.确 定 冲 突 处 理 方 式 :使 用 链 地 址 法 进 行 冲 突 处 理 ,即 每 个
表项为动态链表,无冲突时只有一个项,当发生冲突时,动态为 这个散列值地址对应的表项增加一个子项。
4.确定 Hash 函数:为了将 4 个字节的 IP 地址信息 Hash 到 2 个字节的地址空间中, 同时达到 Hash 函数 要 求 的 简 单 易 用 , 采用折叠法和除留余数法相结合来进行 IP 地址信息的 Hash 运 算。
在理想情况下,不同的关键字 K 根据对应关系 f 进行运算 后 能 够 得 到 唯 一 且 不 同 的 地 址 f(k),这 种 情 况 ,称 为 完 美 Hash。 而对不同的关键字 K 经过对应关系 f 运算后可能得到同一散列 地址,即 K1≠K2,而 f(K1)=f(K2),这种现象称为 冲 突 。 要 实 现 完 美 Hash,往往需要付出巨大的空间代价,因此 在 实 际 应 用 中 ,设 计 Hash 函数时需要考虑冲突与存储空间消耗之间的平衡。
每秒通过计费系统的数据包个数为 100000 个, 校园网 IP 地址数 10000 个,如果使用传统的线性表来存储每个 IP 的 流 量 数 ,在 对 线 性 表 根 据 IP 信 息 进 行 过 排 序 之 后 ,最 佳 情 况 是 使 用 折半查找,其时间复杂度为 O(log2n),n=10000 时平均每个数据包 需 要 花 费 13 次 比 较 。 在 实 际 应 用 中 每 秒 钟 平 均 需 要 进 行 1300000 次的比较操作才能够将流量信息记录到各个 IP 对应的 数据结构中。 且每次新增加 IP 地址后,还需要进行重新排序,其 运算量更为巨大。 因此,我们需要对此进行改进和优化。 2.3 优化处理:
2009 年第 11 期
福建电脑
155
Hash 算法原理及在快速检索中的应用
Baidu Nhomakorabea
陈丛
( 福建师范大学协和学院 福建 福州 350108 )
【摘 要】: Hash 算法能够用来实现快速检索,在需要频繁进行检索定位的情况下,利用 Hash 算法能 够 极 大 地 提 升 检 索 性能,在理想情况下达到 O(1)的性能。 本文介绍了 Hash 算法原理,并从一个校园网流量计费系统的实例入手,诠释快速检索 中 Hash 表的设计和应用。
当冲突发生时, 就必须有一种方法能够对冲突进行处理, 保证每个关键字 K 都能够在存储结构中找到唯一对应的存储位 置,这种方法称为冲突处理方法。 冲突处理方法是保证 Hash 表 检索效率的关键因素之一。 1.3 常用的 Hash 函数构造方法和冲突处理方法
构 造 Hash 函 数 的 目 的 是 为 了 能 够 对 一 个 记 录 的 访 问 过 程 更加迅速有效,通过 Hash 函数,记录将被更快地定位。 常用的定 位方法有以下几种:
2. 处理冲突的方法; 3. Hash 表的装填因子。 Hash 表 的 装 填 因 子 定 义 为 :α = 填 入 表 中 的 元 素 个 数 / Hash 表的长度 α 是 Hash 表装满程度的标志因子。 在表长一定的情况下,α 与"填 入 表 中 的 元 素 个 数"成 正 比 ,所 以 ,α 越 大 ,表 示 填 入 表 中 的元素越多 ,产 生 冲 突 的 可 能 性 就 越 大 ;α 越 小 ,填 入 表 中 的 元 素较少,产生冲突的可能性就越小。 在实际应用中,可以根据要 填入表中的元素数量来调整 Hash 表的长度, 以使整个 Hash 表 获得合理的装填因子 α。 因此,Hash 表的平均比较次 数 是 装 填 因 子 α 的 函 数 ,只 是 在使用不同的冲突处理方法时有不同的函数。 2. Hash 表在快速检索中的应用 Hash 表能够实现 O(1)性能的快速检索,在需要频繁进行检 索定位的情况下, 利用 Hash 表能够极大地提升算法的性能,在 理想情况下达到 O(1)的性能。 下面以一个校园网环境下的流量 计费系统来举例说明。 2.1 需求: 某 校 园 网 需 要 在 出 口 处 部 署 流 量 计 费 系 统 , 统 计 每 个 IP
相关文档
最新文档