哈希表添加、查找和删除方法及装置的制作方法

文档序号:6429571阅读:541来源:国知局
专利名称:哈希表添加、查找和删除方法及装置的制作方法
技术领域
本发明涉及一种哈希表添加、查找和删除方法及装置,属于数据处理技术领域。
背景技术
哈希表(Hash Table)也称为散列表,是一种根据数据关键码值(Key Value)进行直接进行访问的数据结构。传统哈希表通常包含多个具有一定桶深的哈希桶,每个哈希桶都包含了哈希后得到的地址指向该桶的元素。为了使哈希表在冲突存在的情况下达到期望的利用率,通常采用增加哈希桶数量的方式降低冲突率,并采用增加每个哈希桶最大桶深的方式来提高对冲突的容忍度。对于软件结构下的哈希表,只要处理器有足够的处理能力,上述方式均易于实现; 但对于传统硬件结构下的哈希表,不论增加哈希桶的数量,还是增加每个哈希桶的最大深度,都意味着要占用更多的存储资源,而存储资源总是有限的,因此必须在哈希桶的数量及每个哈希桶的最大深度之间做出一种平衡,这就使哈希表的利用效率难以有大的提高。

发明内容
本发明提供一种哈希表添加、查找和删除方法,用以提高哈希表的利用效率及存储空间的利用率。本发明一方面提供一种哈希表添加方法,其中包括提取待添加数据的关键字;对所述关键字进行哈希运算得到哈希地址及哈希指纹;根据所述哈希地址判断相应的目标存储位置是否被占用;当所述目标存储位置被占用时,在所述哈希表中查找未被占用空闲存储位置,并判断所述目标存储位置处的占用节点是否为一个双向链表的首节点;若是,则根据所述哈希指纹,在所述空闲存储位置添加目标节点,并将该目标节点链接到所述占用节点所在双向链表的链尾;若否,则将所述占用节点移动到所述空闲存储位置,并将该占用节点链接到该占用节点所在双向链表的链尾,根据所述哈希指纹,在所述目标存储位置添加目标节点,构成单节点的双向链表。本发明另一方面提供一种哈希表查找方法,其中包括提取待查找数据的关键字;对所述关键字进行哈希运算得到哈希地址及哈希指纹;根据所述哈希地址,在采用如上所述的哈希表添加方法而形成的哈希表中,读取相应目标存储位置处的疑似节点的内容;当该疑似节点中的哈希指纹与所述关键字的哈希指纹不匹配时,判断所述疑似节点是否为一个双向链表的首节点;所述疑似节点为一个双向链表的首节点时,对所述疑似节点所在的双向链表进行遍历查找;当该双向链表中的一个节点的哈希指纹与所述关键字的哈希指纹相匹配时,则查找成功,结束查找。本发明再一方面提供一种哈希表删除方法,其中包括采用如上所述的哈希表查找方法在采用如上所述的哈希表添加方法而形成的哈希表中查找到要删除的目标节点;将所述目标节点从相应的存储位置删除;当所述目标节点在双向链表中还链接有后续节点时,将该后续节点在所述双向链表中的位置前移。本发明又一方面提供一种哈希表添加装置,其中包括提取模块,用于提取待添加数据的关键字;运算模块,用于对提取模块提取出的所述关键字进行哈希运算得到哈希地址及哈希指纹;第一判断模块,用于根据运算模块得到的所述哈希地址判断相应的目标存储位置是否被占用;第二判断模块,用于当第一判断模块判断出所述目标存储位置被占用时,在所述哈希表中查找未被占用空闲存储位置,并判断所述目标存储位置处的占用节点是否为一个双向链表的首节点;第一添加执行模块,用于当第二判断模块的判断结果为是时,根据运算模块得到的所述哈希指纹,在所述空闲存储位置添加目标节点,并将该目标节点链接到所述占用节点所在双向链表的链尾;当第二判断模块的判断结果为否时,将所述占用节点移动到所述空闲存储位置,并将该占用节点链接到该占用节点所在双向链表的链尾,根据运算模块得到的所述哈希指纹,在所述目标存储位置添加目标节点,构成单节点的双向链表。本发明又一方面提供一种哈希表查找装置,其中包括提取模块,用于提取待查找数据的关键字;运算模块,用于对提取模块提取的所述关键字进行哈希运算得到哈希地址及哈希指纹;读取模块,根据运算模块得到的所述哈希地址,在采用如上所述的哈希表添加方法而形成的哈希表中,读取相应目标存储位置处的疑似节点的内容;判断模块,用于当读取模块读取的该疑似节点中的哈希指纹与所述关键字的哈希指纹不匹配时,判断所述疑似节点是否为一个双向链表的首节点;查找模块,用于当判断模块判断出所述疑似节点为一个双向链表的首节点时,对所述疑似节点所在的双向链表进行遍历查找,当该双向链表中的一个节点的哈希指纹与所述关键字的哈希指纹相匹配时,则查找成功,结束查找。本发明又一方面提供一种哈希表删除装置,其中包括查找模块,用于采用如上所述的哈希表查找方法在采用如上所述的哈希表添加方法而形成的哈希表中查找到要删除的目标节点;删除执行模块,用于将查找模块查找到的所述目标节点从相应的存储位置删除;移位模块,用于当查找模块查找到的所述目标节点在双向链表中还链接有后续节点时,将该后续节点在所述双向链表中的位置前移。本发明可以提高哈希表的利用效率及存储空间的利用率。


为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。图1为本发明各实施例中所涉及的哈希表的数据结构示意图;图2为图1所示哈希表中每个节点的数据结构示意图;图3A和图;3B为图2所示每个节点中各字段大小的说明图;图4为本发明所述哈希表添加方法实施例的流程图;图5A 5C为图4所示方法中各步骤的举例示意图;图6为本发明所述哈希表查找方法实施例的流程图;图7为本发明所述哈希表删除方法实施例的流程图;图8为本发明所述哈希表添加装置实施例的结构示意图;图9为本发明所述哈希表查找装置实施例的结构示意图;图10为本发明所述哈希表删除装置实施例的结构示意图。
具体实施例方式为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。首先介绍本发明以下各实施例中所涉及的哈希表的数据结构。如图1所示,该哈希表是硬件结构下的哈希表,图中的方框中的数字表示哈希地址,圆圈表示链表中的每个节点,直线箭头表示节点与哈希地址之间的对应关系,弧线箭头表示相邻节点之间的链接关系。如图2所示,每个节点由四个字段组成,每个节点的内容可以表示为{0C,PRE_ OFST,P0S_0FST,FM},其中标志字段(图中表示为0C)标志当前存储位置是否被占用,“1”表示占用,“0” 表示未占用;指纹字段(图中表示为FM)存放由哈希算法计算出的当前数据的关键字对应的待检测哈希指纹;前向指针字段(图中表示为PRE_0FST)标志在具有相同哈希地址的相邻两个节点中,记录在后一个节点中的、与前一个节点的存储地址距离;后向指针字段(图中表示为P0S_0FST)标志在具有相同哈希地址的相邻两个节点中,记录在前一个节点中的、与后一个节点的存储地址距离。例如,图1中,三个相邻的节点Tl、Ml和Hl通过各自的前向指针字段及后向指针字段构成双向链表。如图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的目标存储位置处的占用节点Hl为一个双向链表的首节点,因此,经过步骤151的添加操作后, 在地址为9的空闲存储位置处添加了目标节点X,并将该目标节点X链接在原先的尾节点 Tl之后成为新的尾节点。步骤152,将所述占用节点移动到所述空闲存储位置,并将该占用节点链接到该占用节点所在双向链表的链尾,根据所述哈希指纹,在所述目标存储位置添加目标节点,构成单节点的双向链表。
例如,在进行添加操作之前的哈希表如图1所示,假设一个待添加数据X的关键字通过哈希运算后得到的哈希地址为6,哈希指纹为FMX,如图1所示,在哈希地址为6的目标存储位置处的占用节点Ml不是一个双向链表的首节点,因此,经过步骤152的添加操作后, 如图5C所示,该占用节点Tl被移动到地址为9的空闲存储位置,并将该占用节点Ml链接到该占用节点Ml所在双向链表的链尾成为新的尾节点,这样做的目的是为了空出地址为6 的目标存储位置;然后,在地址为6的目标存储位置添加了目标节点X,构成单节点的双向链表。图6为本发明所述哈希表查找方法实施例的流程图,如图所示,包括如下步骤步骤210,提取待查找数据的关键字。步骤220,对所述关键字进行哈希运算得到哈希地址及哈希指纹。具体的哈希运算过程可参考现有技术,其中,得到哈希地址的哈希运算与得到哈希指纹的哈希运算有可能是不同的运算过程。步骤230,根据所述哈希地址,在采用图4所示方法而形成的哈希表中,读取相应目标存储位置处的疑似节点的内容,当该疑似节点中的哈希指纹与所述关键字的哈希指纹相匹配时,则查找成功,结束查找;否则继续执行步骤M0。其中,所述疑似节点是指有可能是要查找的目标节点的节点,如果指纹匹配成功, 则可以确定该疑似节点就是目标节点,否则还要继续寻找。步骤M0,判断所述疑似节点是否为一个双向链表的首节点,是则继续执行步骤 250,否则查找失败,结束查找。从上述添加过程可以看出,在图5B中,虽然新添加的节点X占用的是地址为9的存储位置,但该节点X实际上对应的存储位置的地址为5,因此,当所述疑似节点不是一个双向链表的首节点时,表明该疑似节点仅仅是恰巧占用了所述目标存储位置的一个不相关的节点,而非要找的目标节点。而该哈希表中已不可能存在要找的目标节点,因此查找失败。此处需要说明的是,如果所述双向链表为单节点链表,则可以认为该疑似节点既为首节点,也为尾节点。步骤250,对所述疑似节点所在的双向链表进行遍历查找,当该双向链表中的一个节点的哈希指纹与所述关键字的哈希指纹相匹配时,则查找成功;否则查找失败。其中,所述遍历查找是指从作为链首的所述疑似节点开始,沿着所述双向链表逐个节点地向后查找。例如,如图5B所示,假设根据所述哈希地址为5,则在该目标存储位置首先找到的疑似节点为节点H1,然后沿着节点Hl向后找到节点M1,指纹匹配结果为不匹配,因此继续向后找到节点Tl,指纹匹配结果仍然为不匹配;因此继续向后找到节点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、判断模块M及查找模块25,其工作原理如下首先由提取模块21提取待查找数据的关键字;然后由运算模块22对提取模块21 提取的所述关键字进行哈希运算得到哈希地址及哈希指纹;进而由读取模块23运算模块 22得到的所述哈希地址,在采用上述哈希表添加方法而形成的哈希表中,读取相应目标存储位置处的疑似节点的内容。此后,当读取模块23读取的该疑似节点中的哈希指纹与所述关键字的哈希指纹相匹配时,则查找成功,结束查找;而当当读取模块23读取的该疑似节点中的哈希指纹与所述关键字的哈希指纹不匹配时,继续由判断模块M判断所述疑似节点是否为一个双向链表的首节点。当判断模块M判断出所述疑似节点为一个双向链表的首节点时,由查找模块25 对所述疑似节点所在的双向链表进行遍历查找,当该双向链表中的一个节点的哈希指纹与所述关键字的哈希指纹相匹配时,则查找成功,结束查找;否则查找失败,结束查找;否则, 如果判断模块M判断出所述疑似节点为不是一个双向链表的首节点时,则查找失败,结束查找。图10为本发明所述哈希表删除装置实施例的结构示意图,能够实现上述哈希表删除方法,如图所示,该哈希表删除装置30包括查找模块31、删除执行模块32及移位模块33,其工作原理如下首先由查找模块31采用上述哈希表查找方法在采用上述哈希表添加方面而形成的哈希表中查找到要删除的目标节点;然后由删除执行模块32将查找模块31查找到的所述目标节点从相应的存储位置删除;另外,当查找模块31查找到的所述目标节点在双向链表中还链接有后续节点时,进一步由移位模块33将该后续节点在所述双向链表中的位置前移。通过采用本发明上述各实施例所述的添加、查找和删除的装置,可以形成具有双向链表的哈希表,适合硬件实现,并在单个查找引擎顺序查找及不增加存储器使用量的前提下,有效解决哈希冲突,提高哈希表的利用效率,并最大限度的利用存储空间,实现大容量的数据存储。本领域普通技术人员可以理解实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括R0M、RAM、磁碟或者光盘等各种可以存储程序代码的介质。最后应说明的是以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
权利要求
1.一种哈希表添加方法,其特征在于包括 提取待添加数据的关键字;对所述关键字进行哈希运算得到哈希地址及哈希指纹; 根据所述哈希地址判断相应的目标存储位置是否被占用;当所述目标存储位置被占用时,在所述哈希表中查找未被占用空闲存储位置,并判断所述目标存储位置处的占用节点是否为一个双向链表的首节点;若是,则根据所述哈希指纹,在所述空闲存储位置添加目标节点,并将该目标节点链接到所述占用节点所在双向链表的链尾;若否,则将所述占用节点移动到所述空闲存储位置,并将该占用节点链接到该占用节点所在双向链表的链尾,根据所述哈希指纹,在所述目标存储位置添加目标节点,构成单节点的双向链表。
2.根据权利要求1所述的方法,其特征在于还包括当所述目标存储位置未被占用时, 根据所述哈希指纹,在所述目标存储位置添加目标节点,构成单节点的双向链表。
3.一种哈希表查找方法,其特征在于包括 提取待查找数据的关键字;对所述关键字进行哈希运算得到哈希地址及哈希指纹;根据所述哈希地址,在采用权利要求1或2所述方法而形成的哈希表中,读取相应目标存储位置处的疑似节点的内容;当该疑似节点中的哈希指纹与所述关键字的哈希指纹不匹配时,判断所述疑似节点是否为一个双向链表的首节点;所述疑似节点为一个双向链表的首节点时,对所述疑似节点所在的双向链表进行遍历查找;当该双向链表中的一个节点的哈希指纹与所述关键字的哈希指纹相匹配时,则查找成功,结束查找。
4.根据权利要求3所述的方法,其特征在于所述读取相应目标存储位置处的疑似节点的内容之后还包括当该疑似节点中的哈希指纹与所述关键字的哈希指纹相匹配时,则查找成功,结束查找。
5.根据权利要求3所述的方法,其特征在于还包括所述疑似节点不是一个双向链表的首节点时,则查找失败,结束查找。
6.一种哈希表删除方法,其特征在于包括采用权利要求3 5中任一项所述方法在采用权利要求1或2所述方法而形成的哈希表中查找到要删除的目标节点;将所述目标节点从相应的存储位置删除;当所述目标节点在双向链表中还链接有后续节点时,将该后续节点在所述双向链表中的位置前移。
7.一种哈希表添加装置,其特征在于包括 提取模块,用于提取待添加数据的关键字;运算模块,用于对提取模块提取出的所述关键字进行哈希运算得到哈希地址及哈希指纹;第一判断模块,用于根据运算模块得到的所述哈希地址判断相应的目标存储位置是否被占用;第二判断模块,用于当第一判断模块判断出所述目标存储位置被占用时,在所述哈希表中查找未被占用空闲存储位置,并判断所述目标存储位置处的占用节点是否为一个双向链表的首节点;第一添加执行模块,用于当第二判断模块的判断结果为是时,根据运算模块得到的所述哈希指纹,在所述空闲存储位置添加目标节点,并将该目标节点链接到所述占用节点所在双向链表的链尾;当第二判断模块的判断结果为否时,将所述占用节点移动到所述空闲存储位置,并将该占用节点链接到该占用节点所在双向链表的链尾,根据运算模块得到的所述哈希指纹,在所述目标存储位置添加目标节点,构成单节点的双向链表。
8.根据权利要求7所述的装置,其特征在于还包括第二添加执行模块,用于当第一判断模块判断出所述目标存储位置未被占用时,根据运算模块得到的所述哈希指纹,在所述目标存储位置添加目标节点,构成单节点的双向链表。
9.一种哈希表查找装置,其特征在于包括提取模块,用于提取待查找数据的关键字;运算模块,用于对提取模块提取的所述关键字进行哈希运算得到哈希地址及哈希指纹;读取模块,根据运算模块得到的所述哈希地址,在采用权利要求1或2所述方法而形成的哈希表中,读取相应目标存储位置处的疑似节点的内容;判断模块,用于当读取模块读取的该疑似节点中的哈希指纹与所述关键字的哈希指纹不匹配时,判断所述疑似节点是否为一个双向链表的首节点;查找模块,用于当判断模块判断出所述疑似节点为一个双向链表的首节点时,对所述疑似节点所在的双向链表进行遍历查找,当该双向链表中的一个节点的哈希指纹与所述关键字的哈希指纹相匹配时,则查找成功,结束查找。
10.一种哈希表删除装置,其特征在于包括查找模块,用于采用权利要求3 5中任一项所述方法在采用权利要求1或2所述方法而形成的哈希表中查找到要删除的目标节点;删除执行模块,用于将查找模块查找到的所述目标节点从相应的存储位置删除;移位模块,用于当查找模块查找到的所述目标节点在双向链表中还链接有后续节点时,将该后续节点在所述双向链表中的位置前移。
全文摘要
一种哈希表添加、查找和删除方法及装置。其中哈希表添加方法包括提取待添加数据的关键字;对关键字进行哈希运算得到哈希地址及哈希指纹;根据哈希地址判断相应的目标存储位置是否被占用;当目标存储位置被占用时,在哈希表中查找未被占用空闲存储位置,并判断目标存储位置处的占用节点是否为一个双向链表的首节点;若是,则根据哈希指纹,在空闲存储位置添加目标节点,并将该目标节点链接到占用节点所在双向链表的链尾;若否,则将占用节点移动到空闲存储位置,并将该占用节点链接到该占用节点所在双向链表的链尾,根据哈希指纹,在目标存储位置添加目标节点,构成单节点的双向链表。本发明可以提高哈希表的利用效率及存储空间的利用率。
文档编号G06F17/30GK102314485SQ201110212730
公开日2012年1月11日 申请日期2011年7月27日 优先权日2011年7月27日
发明者孙云刚, 孙才, 陈曦 申请人:中国科学院计算机网络信息中心
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1