哈希表添加、 查找和删除方法及装置 【技术领域】
本发明涉及一种哈希表添加、 查找和删除方法及装置, 属于数据处理技术领域。背景技术 哈希表 (Hash Table) 也称为散列表, 是一种根据数据关键码值 (Key Value) 进行 直接进行访问的数据结构。传统哈希表通常包含多个具有一定桶深的哈希桶, 每个哈希桶 都包含了哈希后得到的地址指向该桶的元素。 为了使哈希表在冲突存在的情况下达到期望 的利用率, 通常采用增加哈希桶数量的方式降低冲突率, 并采用增加每个哈希桶最大桶深 的方式来提高对冲突的容忍度。
对于软件结构下的哈希表, 只要处理器有足够的处理能力, 上述方式均易于实现 ; 但对于传统硬件结构下的哈希表, 不论增加哈希桶的数量, 还是增加每个哈希桶的最大深 度, 都意味着要占用更多的存储资源, 而存储资源总是有限的, 因此必须在哈希桶的数量及 每个哈希桶的最大深度之间做出一种平衡, 这就使哈希表的利用效率难以有大的提高。
发明内容 本发明提供一种哈希表添加、 查找和删除方法, 用以提高哈希表的利用效率及存 储空间的利用率。
本发明一方面提供一种哈希表添加方法, 其中包括 :
提取待添加数据的关键字 ;
对所述关键字进行哈希运算得到哈希地址及哈希指纹 ;
根据所述哈希地址判断相应的目标存储位置是否被占用 ;
当所述目标存储位置被占用时, 在所述哈希表中查找未被占用空闲存储位置, 并 判断所述目标存储位置处的占用节点是否为一个双向链表的首节点 ;
若是, 则根据所述哈希指纹, 在所述空闲存储位置添加目标节点, 并将该目标节点 链接到所述占用节点所在双向链表的链尾 ;
若否, 则将所述占用节点移动到所述空闲存储位置, 并将该占用节点链接到该占 用节点所在双向链表的链尾, 根据所述哈希指纹, 在所述目标存储位置添加目标节点, 构成 单节点的双向链表。
本发明另一方面提供一种哈希表查找方法, 其中包括 :
提取待查找数据的关键字 ;
对所述关键字进行哈希运算得到哈希地址及哈希指纹 ;
根据所述哈希地址, 在采用如上所述的哈希表添加方法而形成的哈希表中, 读取 相应目标存储位置处的疑似节点的内容 ;
当该疑似节点中的哈希指纹与所述关键字的哈希指纹不匹配时, 判断所述疑似节 点是否为一个双向链表的首节点 ;
所述疑似节点为一个双向链表的首节点时, 对所述疑似节点所在的双向链表进行
遍历查找 ;
当该双向链表中的一个节点的哈希指纹与所述关键字的哈希指纹相匹配时, 则查 找成功, 结束查找。
本发明再一方面提供一种哈希表删除方法, 其中包括 :
采用如上所述的哈希表查找方法在采用如上所述的哈希表添加方法而形成的哈 希表中查找到要删除的目标节点 ;
将所述目标节点从相应的存储位置删除 ;
当所述目标节点在双向链表中还链接有后续节点时, 将该后续节点在所述双向链 表中的位置前移。
本发明又一方面提供一种哈希表添加装置, 其中包括 :
提取模块, 用于提取待添加数据的关键字 ;
运算模块, 用于对提取模块提取出的所述关键字进行哈希运算得到哈希地址及哈 希指纹 ;
第一判断模块, 用于根据运算模块得到的所述哈希地址判断相应的目标存储位置 是否被占用 ;
第二判断模块, 用于当第一判断模块判断出所述目标存储位置被占用时, 在所述 哈希表中查找未被占用空闲存储位置, 并判断所述目标存储位置处的占用节点是否为一个 双向链表的首节点 ;
第一添加执行模块, 用于当第二判断模块的判断结果为是时, 根据运算模块得到 的所述哈希指纹, 在所述空闲存储位置添加目标节点, 并将该目标节点链接到所述占用节 点所在双向链表的链尾 ; 当第二判断模块的判断结果为否时, 将所述占用节点移动到所述 空闲存储位置, 并将该占用节点链接到该占用节点所在双向链表的链尾, 根据运算模块得 到的所述哈希指纹, 在所述目标存储位置添加目标节点, 构成单节点的双向链表。
本发明又一方面提供一种哈希表查找装置, 其中包括 :
提取模块, 用于提取待查找数据的关键字 ;
运算模块, 用于对提取模块提取的所述关键字进行哈希运算得到哈希地址及哈希 指纹 ;
读取模块, 根据运算模块得到的所述哈希地址, 在采用如上所述的哈希表添加方 法而形成的哈希表中, 读取相应目标存储位置处的疑似节点的内容 ;
判断模块, 用于当读取模块读取的该疑似节点中的哈希指纹与所述关键字的哈希 指纹不匹配时, 判断所述疑似节点是否为一个双向链表的首节点 ;
查找模块, 用于当判断模块判断出所述疑似节点为一个双向链表的首节点时, 对 所述疑似节点所在的双向链表进行遍历查找, 当该双向链表中的一个节点的哈希指纹与所 述关键字的哈希指纹相匹配时, 则查找成功, 结束查找。
本发明又一方面提供一种哈希表删除装置, 其中包括 :
查找模块, 用于采用如上所述的哈希表查找方法在采用如上所述的哈希表添加方 法而形成的哈希表中查找到要删除的目标节点 ;
删除执行模块, 用于将查找模块查找到的所述目标节点从相应的存储位置删除 ;
移位模块, 用于当查找模块查找到的所述目标节点在双向链表中还链接有后续节点时, 将该后续节点在所述双向链表中的位置前移。
本发明可以提高哈希表的利用效率及存储空间的利用率。 附图说明 为了更清楚地说明本发明实施例或现有技术中的技术方案, 下面将对实施例或现 有技术描述中所需要使用的附图作一简单地介绍, 显而易见地, 下面描述中的附图是本发 明的一些实施例, 对于本领域普通技术人员来讲, 在不付出创造性劳动的前提下, 还可以根 据这些附图获得其他的附图。
图 1 为本发明各实施例中所涉及的哈希表的数据结构示意图 ;
图 2 为图 1 所示哈希表中每个节点的数据结构示意图 ;
图 3A 和图 3B 为图 2 所示每个节点中各字段大小的说明图 ;
图 4 为本发明所述哈希表添加方法实施例的流程图 ;
图 5A ~ 5C 为图 4 所示方法中各步骤的举例示意图 ;
图 6 为本发明所述哈希表查找方法实施例的流程图 ;
图 7 为本发明所述哈希表删除方法实施例的流程图 ;
图 8 为本发明所述哈希表添加装置实施例的结构示意图 ; 图 9 为本发明所述哈希表查找装置实施例的结构示意图 ; 图 10 为本发明所述哈希表删除装置实施例的结构示意图。具体实施方式
为使本发明实施例的目的、 技术方案和优点更加清楚, 下面将结合本发明实施例 中的附图, 对本发明实施例中的技术方案进行清楚、 完整地描述, 显然, 所描述的实施例是 本发明一部分实施例, 而不是全部的实施例。 基于本发明中的实施例, 本领域普通技术人员 在没有作出创造性劳动前提下所获得的所有其他实施例, 都属于本发明保护的范围。
首先介绍本发明以下各实施例中所涉及的哈希表的数据结构。
如图 1 所示, 该哈希表是硬件结构下的哈希表, 图中的方框中的数字表示哈希地 址, 圆圈表示链表中的每个节点, 直线箭头表示节点与哈希地址之间的对应关系, 弧线箭头 表示相邻节点之间的链接关系。
如图 2 所示, 每个节点由四个字段组成, 每个节点的内容可以表示为 {OC, PRE_ OFST, POS_OFST, FM}, 其中 :
标志字段 ( 图中表示为 : OC) : 标志当前存储位置是否被占用, “1” 表示占用, “0” 表示未占用 ;
指纹字段 ( 图中表示为 : FM) : 存放由哈希算法计算出的当前数据的关键字对应的 待检测哈希指纹 ;
前向指针字段 ( 图中表示为 : PRE_OFST) : 标志在具有相同哈希地址的相邻两个节 点中, 记录在后一个节点中的、 与前一个节点的存储地址距离 ;
后向指针字段 ( 图中表示为 : POS_OFST) : 标志在具有相同哈希地址的相邻两个节 点中, 记录在前一个节点中的、 与后一个节点的存储地址距离。
例如, 图 1 中, 三个相邻的节点 T1、 M1 和 H1 通过各自的前向指针字段及后向指针字段构成双向链表。
如图 3A 及图 3B 所示, 每个节点均占用硬件存储器中特定长度的存储空间。在图 3A 中, 每个节点占用 32 个比特位, 其中, 每个指针占用 4 个比特位, 因此属于同一个双向链 表的相邻节点允许最大跨越 15 个节点 ; 在图 3B 中, 每个节点占用 64 个比特位, 其中, 每个 指针占用 11 个比特位, 因此属于同一个双向链表的相邻节点允许最大跨越 2047 个节点。
图 4 为本发明所述哈希表添加方法实施例的流程图, 如图所示, 包括如下步骤 :
步骤 110, 提取待添加数据的关键字。
步骤 120, 对所述关键字进行哈希运算得到哈希地址及哈希指纹。
具体的哈希运算过程可参考现有技术, 其中, 得到哈希地址的哈希运算与得到哈 希指纹的哈希运算有可能是不同的运算过程。
步骤 130, 根据所述哈希地址判断相应的目标存储位置是否被占用, 当未被占用 时, 执行步骤 140, 否则执行步骤 150。
具体地, 如前所述, 可以根据所述目标存储位置的目标节点的标志字段的值确定 其存储位置是否被占用。
步骤 140, 根据所述哈希指纹, 在所述目标存储位置添加目标节点, 构成单节点的 双向链表。 具体地, 在所述目标节点的指纹字段保存所述哈希指纹, 将标示字段的值设置为 “1” , 将前向指针及后向指针的值均设置为 “0” 。例如, 在进行添加操作之前的哈希表如图 1 所示, 假设一个待添加数据 X 的关键字通过哈希运算后得到的哈希地址为 9, 哈希指纹为 FMX, 如图 5A 所示, 经过步骤 140 的添加操作后, 在地址为 9 的目标存储位置创建了一个新 的双向链表, 该双向链表只具有一个节点, 即所述目标节点, 其内容为 {1, 0, 0, FMX}。
步骤 150, 在所述哈希表中查找未被占用空闲存储位置, 并判断所述目标存储位置 处的占用节点是否为一个双向链表的首节点, 是则执行步骤 151, 否则执行步骤 152。
其中, 占用节点是指占用所述目标存储位置的节点, 具体地, 当该占用节点的前向 指针字段的值为 0 时, 则表明该占用节点之前并不与其他节点相链接, 因此该占用节点为 双向链表的首节点, 否则该占用节点不是双向链表的首节点。 具体地, 所述空闲存储位置可 以是位于所述目标存储位置之后, 且距离最近的空闲存储位置。
此处需要说明的是, 如果所述双向链表为单节点链表, 则可以认为该单节点既为 首节点, 也为尾节点。
步骤 151, 根据所述哈希指纹, 在所述空闲存储位置添加目标节点, 并将该目标节 点链接到所述占用节点所在双向链表的链尾。
例如, 在进行添加操作之前的哈希表如图 1 所示, 假设一个待添加数据 X 的关键字 通过哈希运算后得到的哈希地址为 5, 哈希指纹为 FMX, 如图 5B 所示, 在哈希地址为 5 的目 标存储位置处的占用节点 H1 为一个双向链表的首节点, 因此, 经过步骤 151 的添加操作后, 在地址为 9 的空闲存储位置处添加了目标节点 X, 并将该目标节点 X 链接在原先的尾节点 T1 之后成为新的尾节点。
步骤 152, 将所述占用节点移动到所述空闲存储位置, 并将该占用节点链接到该占 用节点所在双向链表的链尾, 根据所述哈希指纹, 在所述目标存储位置添加目标节点, 构成 单节点的双向链表。
例如, 在进行添加操作之前的哈希表如图 1 所示, 假设一个待添加数据 X 的关键字 通过哈希运算后得到的哈希地址为 6, 哈希指纹为 FMX, 如图 1 所示, 在哈希地址为 6 的目标 存储位置处的占用节点 M1 不是一个双向链表的首节点, 因此, 经过步骤 152 的添加操作后, 如图 5C 所示, 该占用节点 T1 被移动到地址为 9 的空闲存储位置, 并将该占用节点 M1 链接 到该占用节点 M1 所在双向链表的链尾成为新的尾节点, 这样做的目的是为了空出地址为 6 的目标存储位置 ; 然后, 在地址为 6 的目标存储位置添加了目标节点 X, 构成单节点的双向 链表。
图 6 为本发明所述哈希表查找方法实施例的流程图, 如图所示, 包括如下步骤 :
步骤 210, 提取待查找数据的关键字。
步骤 220, 对所述关键字进行哈希运算得到哈希地址及哈希指纹。
具体的哈希运算过程可参考现有技术, 其中, 得到哈希地址的哈希运算与得到哈 希指纹的哈希运算有可能是不同的运算过程。
步骤 230, 根据所述哈希地址, 在采用图 4 所示方法而形成的哈希表中, 读取相应 目标存储位置处的疑似节点的内容, 当该疑似节点中的哈希指纹与所述关键字的哈希指纹 相匹配时, 则查找成功, 结束查找 ; 否则继续执行步骤 240。 其中, 所述疑似节点是指有可能是要查找的目标节点的节点, 如果指纹匹配成功, 则可以确定该疑似节点就是目标节点, 否则还要继续寻找。
步骤 240, 判断所述疑似节点是否为一个双向链表的首节点, 是则继续执行步骤 250, 否则查找失败, 结束查找。
从上述添加过程可以看出, 在图 5B 中, 虽然新添加的节点 X 占用的是地址为 9 的 存储位置, 但该节点 X 实际上对应的存储位置的地址为 5, 因此, 当所述疑似节点不是一个 双向链表的首节点时, 表明该疑似节点仅仅是恰巧占用了所述目标存储位置的一个不相关 的节点, 而非要找的目标节点。而该哈希表中已不可能存在要找的目标节点, 因此查找失 败。
此处需要说明的是, 如果所述双向链表为单节点链表, 则可以认为该疑似节点既 为首节点, 也为尾节点。
步骤 250, 对所述疑似节点所在的双向链表进行遍历查找, 当该双向链表中的一个 节点的哈希指纹与所述关键字的哈希指纹相匹配时, 则查找成功 ; 否则查找失败。
其中, 所述遍历查找是指从作为链首的所述疑似节点开始, 沿着所述双向链表逐 个节点地向后查找。例如, 如图 5B 所示, 假设根据所述哈希地址为 5, 则在该目标存储位置 首先找到的疑似节点为节点 H1, 然后沿着节点 H1 向后找到节点 M1, 指纹匹配结果为不匹 配, 因此继续向后找到节点 T1, 指纹匹配结果仍然为不匹配 ; 因此继续向后找到节点 X, 指 纹匹配结果为匹配, 此时查找成功。
图 7 为本发明所述哈希表删除方法实施例的流程图, 如图所示, 包括如下步骤 :
步骤 310, 采用图 6 所示方法在采用图 4 所示方法而形成的哈希表中查找到要删除 的目标节点。
步骤 320, 将所述目标节点从相应的存储位置删除。
步骤 330, 当所述目标节点在双向链表中还链接有后续节点时, 将该后续节点在所 述双向链表中的位置前移。
其中, 所述后续节点是指链接在目标节点之后的节点, 进行前移的目的是为了在 将目标节点删除后, 保持双向链表中余下节点的连续性。
通过采用本发明上述各实施例所述的添加、 查找和删除的方法, 可以形成具有双 向链表的哈希表, 适合硬件实现, 并在单个查找引擎顺序查找及不增加存储器使用量的前 提下, 有效解决哈希冲突, 提高哈希表的利用效率, 并最大限度的利用存储空间, 实现大容 量的数据存储。
图 8 为本发明所述哈希表添加装置实施例的结构示意图, 能够实现上述哈希表添 加方法, 如图所示, 该哈希表添加装置 10 包括 : 提取模块 11、 运算模块 12、 第一判断模块 13、 第二判断模块 14、 第一添加执行模块 15 及第二添加执行模块 16, 其工作原理如下 :
首先由提取模块 11 提取待添加数据的关键字 ; 然后由运算模块 12 对提取模块 11 提取出的所述关键字进行哈希运算得到哈希地址及哈希指纹。
此后, 第一判断模块 13 根据运算模块 12 得到的所述哈希地址判断相应的目标存 储位置是否被占用, 当第一判断模块 13 判断出所述目标存储位置未被占用时, 由第二添加 执行模块 16 根据运算模块 12 得到的所述哈希指纹, 在所述目标存储位置添加目标节点, 构 成单节点的双向链表, 具体的举例可参见图 5A 及其相关说明。
当第一判断模块 13 判断出所述目标存储位置被占用时, 由第二判断模块 14 在所 述哈希表中查找未被占用空闲存储位置, 并判断所述目标存储位置处的占用节点是否为一 个双向链表的首节点 ; 当第二判断模块 14 的判断结果为是时, 由第一添加执行模块 15 根据 运算模块 12 得到的所述哈希指纹, 在所述空闲存储位置添加目标节点, 并将该目标节点链 接到所述占用节点所在双向链表的链尾, 。
当第二判断模块 14 的判断结果为否时, 由第一添加执行模块 15 将所述占用节点 移动到所述空闲存储位置, 并将该占用节点链接到该占用节点所在双向链表的链尾, 根据 运算模块 12 得到的所述哈希指纹, 在所述目标存储位置添加目标节点, 构成单节点的双向 链表, 具体的举例可参见图 5C 及其相关说明。
图 9 为本发明所述哈希表查找装置实施例的结构示意图, 能够实现上述哈希表查 找方法, 如图所示, 该哈希表查找装置 20 包括 : 提取模块 21、 运算模块 22、 读取模块 23、 判 断模块 24 及查找模块 25, 其工作原理如下 :
首先由提取模块 21 提取待查找数据的关键字 ; 然后由运算模块 22 对提取模块 21 提取的所述关键字进行哈希运算得到哈希地址及哈希指纹 ; 进而由读取模块 23 运算模块 22 得到的所述哈希地址, 在采用上述哈希表添加方法而形成的哈希表中, 读取相应目标存 储位置处的疑似节点的内容。
此后, 当读取模块 23 读取的该疑似节点中的哈希指纹与所述关键字的哈希指纹 相匹配时, 则查找成功, 结束查找 ; 而当当读取模块 23 读取的该疑似节点中的哈希指纹与 所述关键字的哈希指纹不匹配时, 继续由判断模块 24 判断所述疑似节点是否为一个双向 链表的首节点。
当判断模块 24 判断出所述疑似节点为一个双向链表的首节点时, 由查找模块 25 对所述疑似节点所在的双向链表进行遍历查找, 当该双向链表中的一个节点的哈希指纹与 所述关键字的哈希指纹相匹配时, 则查找成功, 结束查找 ; 否则查找失败, 结束查找 ; 否则, 如果判断模块 24 判断出所述疑似节点为不是一个双向链表的首节点时, 则查找失败, 结束查找。 图 10 为本发明所述哈希表删除装置实施例的结构示意图, 能够实现上述哈希表 删除方法, 如图所示, 该哈希表删除装置 30 包括 : 查找模块 31、 删除执行模块 32 及移位模 块 33, 其工作原理如下 :
首先由查找模块 31 采用上述哈希表查找方法在采用上述哈希表添加方面而形成 的哈希表中查找到要删除的目标节点 ; 然后由删除执行模块 32 将查找模块 31 查找到的所 述目标节点从相应的存储位置删除 ; 另外, 当查找模块 31 查找到的所述目标节点在双向链 表中还链接有后续节点时, 进一步由移位模块 33 将该后续节点在所述双向链表中的位置 前移。
通过采用本发明上述各实施例所述的添加、 查找和删除的装置, 可以形成具有双 向链表的哈希表, 适合硬件实现, 并在单个查找引擎顺序查找及不增加存储器使用量的前 提下, 有效解决哈希冲突, 提高哈希表的利用效率, 并最大限度的利用存储空间, 实现大容 量的数据存储。
本领域普通技术人员可以理解 : 实现上述方法实施例的全部或部分步骤可以通过 程序指令相关的硬件来完成, 前述的程序可以存储于一计算机可读取存储介质中, 该程序 在执行时, 执行包括上述方法实施例的步骤 ; 而前述的存储介质包括 : ROM、 RAM、 磁碟或者 光盘等各种可以存储程序代码的介质。
最后应说明的是 : 以上实施例仅用以说明本发明的技术方案, 而非对其限制 ; 尽 管参照前述实施例对本发明进行了详细的说明, 本领域的普通技术人员应当理解 : 其依然 可以对前述各实施例所记载的技术方案进行修改, 或者对其中部分技术特征进行等同替 换; 而这些修改或者替换, 并不使相应技术方案的本质脱离本发明各实施例技术方案的精 神和范围。