哈希表的表项添加、删除、查找方法及哈希表存储装置
技术领域
本发明涉及通信技术领域,尤其涉及一种哈希表的表项添加、删除、查找方法及其存储装置。
背景技术
在通信领域中,存在着多种的匹配算法,例如,对于精确匹配的查找,可以采用哈希算法。所述的哈希查找的过程就是用哈希函数对输入的查找键值(Key)进行缩位运算,再用计算得到的哈希值在哈希索引表中寻址,找到匹配项后读出对应项中存放的哈希索引(Hash Index),最后用哈希索引在直接地址映射表寻址,得到所需的查找结果。
哈希算法是一种常见的快速查找算法,它的基本思想是以线性表中每个元素的关键字k为自变量。通过一定的函数关系H(k),计算出对应的函数值来,并把这个值解释为一块连续存储空间的单元,将该元素存储到这个单元中。哈希算法将元素的存储位置和它的关键字之间建立一个确定的对应关系,查找时,不需要比较,一次哈希映射就可以查找所需元素。
在哈希函数中,对不同的关键字可能得到同一哈希地址,即key1≠key2,而H(key1)=H(key2),这种情况叫冲突(Collision)。一般来说,遇到冲突是很正常的事情,关键在于遇到冲突后怎么处理,以达到要求的查找目的。处理冲突,主要有以下两种方法:一是选择和改进比较好的哈希函数;二是选择比较合适的表项存储结构。
目前,对于路由查找这类的应用,采用CRC(Cyclic Redundancy Checking,循环冗余码校验)类的哈希函数是比较适合的。通过选取不同的CRC多项式,可以实现同一个位宽下的不同哈希函数。
在选择合适的表存储结构解决冲突问题方面,可以采用多维哈希表、冲突链、Double Hashing等。仿真实验结果表明,使用这些方法,在保证无表项遗留即所有表项都能存入的前提条件下,计算哈希值的次数跟需要的存储表空间存在对立的关系,也就是说如果想要以足够小的存储空间放下所有的表项,则需要进行足够多次数的哈希运算。这样就会造成对同一块表的多次访问,由于表只有一张,所以查找只能顺序进行,这会严重影响查表的速度;另一方面,如果想要以足够少的计算次数就能找到存储空位,那么就要保证存储空间足够的大,空间利用率就会大大的降低。如果采用多张哈希表并行查找,则需要占用多个存储器接口,不利于硬件上的实现。
发明内容
本发明要解决的主要技术问题是,提供一种哈希表的表项添加、删除、查找方法,及其存储装置,以极小的查找时间代价以及较高的表空间利用率实现全部表项存储而无表项遗留;同时只需访问一次就能够准确的查找到需要的表项;同时也便于硬件与存储器之间接口的实现,能够在表空间大小,查找效率以及硬件实现方面获得比较好的均衡。
为解决上述技术问题,本发明采用的技术方案如下:
一种哈希表的表项添加方法,包括:
将哈希表拆分为多张哈希子表,每一张哈希子表对应一张位图,每一张位图对应一个哈希函数;
确定当前目标哈希子表,利用当前目标哈希子表所对应的位图相应的哈希函数计算待存储表项的键值的哈希值,根据所述哈希值确定当前目标哈希子表所对应的存储位置是否空位,如是,将所述待存储表项的信息存入该空位中,否则,更新当前目标哈希子表直至找到空位存储所述待存储表项的信息。
进一步地,所述位图包含了冲突位和有效位,根据所述哈希值确定当前目标哈希子表所对应的存储位置是否空位,如是,将所述待存储表项的信息存入该空位中,否则,更新当前目标哈希子表直至找到空位存储所述待存储表项的信息的步骤,包括:
以所述哈希值作为索引,查找所述当前目标哈希子表对应的位图;
判断所述位图的有效位是否有效,且所述位图的冲突位是否为无效;
如果所述有效位为有效,且所述冲突位为无效,则确定所述当前目标哈希子表所对应的存储位置为空位,则将所述待存储表项的信息存入该空位;否则,更新当前目标哈希子表直至找到空位存储所述待存储表项的信息。
更进一步地,所述以所述哈希值作为索引,查找所述当前目标哈希子表对应的位图的步骤,包括:
判断当前目标哈希子表的容量是否小于计算得到的所述哈希值的位数;
如果所述当前目标哈希子表的容量小于计算得到的所述哈希值的位数,则截取所述哈希值,并将截取后的哈希值作为索引,查找所述当前目标哈希子表对应的位图。
更进一步地,将所述待存储表项的信息存入空位后,还包括:
将所述位图的有效位置为无效,并将所述待存储表项的键值存储到该位图中。
更进一步地,更新当前目标哈希子表直至找到空位存储所述待存储表项的信息的步骤,包括:
当所述位图的冲突位为无效,有效位为无效,则将该位图对应的哈希子表中已存的表项取出,将该冲突位置为有效,并将取出表项的键值与当前的待存储表项的键值存入该位图中;
判断当前的目标哈希子表是否为最后一张哈希子表,如果不是最后一张哈希子表,则将当前目标哈希子表更新为下一张哈希子表,直至查找到空位存储所述待存储表项的信息。
更进一步地,更新当前目标哈希子表直至找到空位存储所述待存储表项的信息的步骤,包括:
当该位图的冲突位为有效,则当前的待存储表项的键值直接存入到该位图中;
判断当前目标哈希子表是否为最后一张哈希子表,如果不是最后一张哈希子表,则将当前目标哈希子表更新为下一张哈希子表,直至找到空位存储所述待存储表项的信息。
更进一步地,所述方法还包括:
当所述待存储表项存储完成后,同步更新位图的冲突位信息和哈希子表的信息。
更进一步地,所述哈希子表对应的哈希函数为循环冗余码校验函数。
更进一步地,所述多张哈希子表对应的哈希函数之间采用不同的循环冗余码校验多项式。
一种哈希表的表项删除方法,哈希表包括多张哈希子表,每一张哈希子表对应一张位图,每一张位图对应一个哈希函数,且每张所述位图包括多个条目,则所述方法包括:
每张位图所对应的哈希函数并行计算需要删除的条目的哈希值;
根据计算得到的哈希值,在其各自对应的位图中并行查找;
将每一张位图的查找结果顺序进行比较,当第一次出现冲突位为无效时,将该位图的地址对应的哈希子表中的表项取出;
将取出的表项的键值与需要查找的键值进行比较,如果相同,则将所述表项从所述哈希子表中删除。
进一步地,删除表项后还包括;
将对应的位图的冲突位置为无效,有效位置为有效。
进一步地,所述方法还包括:
将删除的表项所在的位图之前的所有位图中的所存储的所有键值进行比较;
如果某个位图中所存储的键值大于两个,则直接将需要删除的键值删掉;或者,
如果某个位图中所存储的键值等于两个,则将需要删除的键值删掉,并查找到另一个键值所存储的位置,将其取出,存入该位图所对应的哈希子表中。
一种哈希表的查找方法,所述哈希表包括多张哈希子表,每张哈希子表对应一张位图,每张位图对应一个哈希函数,则所述哈希表查找方法包括:
利用每张哈希子表对应的哈希函数并行计算待查找表项的键值的哈希值;
根据计算得到的所述哈希值在对应的位图中并行查找;
将每一张位图的查找结果顺序进行比较,当第一次出现冲突位为无效时,取出该位图的地址对应的哈希子表中的表项;
将取出的表项的键值与待查找表项的键值进行比较,如果取出的表项的键值与所述待查找表项的键值相匹配,则将该表项的信息作为最终查表结果。
进一步地,所述方法还包括:如果取出的表项的键值与所述待查找表项的键值不相匹配,则返回查找失败的消息。
更进一步地,根据计算得到的所述哈希值在对应的位图中并行查找的步骤,包括:
根据计算得到的所述哈希值对应的哈希子表的容量,对所述哈希值进行截取;
将截取后的哈希值作为索引,在其对应的位图中并行查找。
更进一步地,所述位图对应的哈希函数与存储表项时所述哈希子表对应的哈希函数相同。
一种哈希表存储装置,包括主控逻辑模块,以及与所述主控逻辑模块相连的控制线路和数据线路,其中,主控逻辑模块控制所述控制线路完成表项的添加和/或删除,以及控制数据线路完成表项查找,所述控制线路包括:表项拆分模块,目标哈希子表确定模块和表项存储模块,其中,
所述表项拆分模块,用于将哈希表拆分为多张哈希子表和多张位图,且每张哈希子表对应一张位图和一个哈希函数;
所述目标哈希子表确定模块,与所述表项拆分模块相连,用于从所述表项拆分模块拆分得到的多张哈希子表中的确定一张哈希子表作为当前的目标哈希子表;并当接收到所述表项存储模块发出的更新指令后,用于将当前的目标哈希子表更新为其下一张哈希子表;
所述表项存储模块,与所述目标哈希子表确定模块相连,用于利用所述当前目标哈希子表所对应的哈希函数,计算所述待存储表项的键值的哈希值,并根据所述哈希值确定当前目标哈希子表所对应的存储位置是否为空位,如是,将待存储表项的信息存入该空位,否则向所述目标哈希子表确定模块发送更新指令,直至查找到空位存储所述待存储表项的。
进一步地,所述位图包含冲突位和有效位,所述表项存储模块包括计算子模块、查找子模块、表项添加子模块,其中,
所述计算子模块,与所述目标哈希子表确定模块相连,用于利用所述当前目标哈希子表所对应的哈希函数,计算所述待存储表项的键值的哈希值;
所述查找子模块,与所述计算子模块相连,用于判断所述目标哈希子表确定模块计算的哈希值的位数是否大于等于所述当前目标哈希子表的容量,如是,则截取所述哈希值,并将截取后的哈希值作为索引,查找相应的位图,并判断所述位图的有效位是否有效,且所述位图的冲突位是否为无效,如是,则判定所述目标哈希子表中的存储位置为空位,否则,则向所述目标哈希子表确定模块发送更新指令,直至查找到空位;
所述表项添加子模块,与所述查找子模块相连,用于当所述查找子模块在所述当前目标哈希子表中查找到空位时,将所述待存储表项的信息存入所述空位中。
进一步地,当所述表项添加子模块,将所述待存储表项的信息存入所述空位中后,所述表项添加子模块还用于将所述位图的有效位置为无效,并将所述待存储表项的键值存储到所述位图中。
进一步地,当所述查找子模块判断出所述位图的有效位为无效时,还用于判断所述位图的冲突位是否为无效,如是,则所述表项添加子模块用于将所述位图对应哈希子表中已存储的表项取出,并将取出的表项的键值与所述当前待存储表项的键值存入到所述位图中;当所述查找子模块判断出所述位图的冲突位为有效时,则所述表项存储模块的表项添加子模块用于将当前的所述待存储表项的键值存储到所述位图中。
进一步地,所述哈希表包括多张哈希子表,每张哈希子表对应一张位图和一个哈希函数,所述数据线路包括并行计算模块,并行查找模块以及比较模块,其中,
并行计算模块,用于利用每张哈希子表对应的哈希函数,并行计算待查找表项的键值的哈希值;
并行查找模块,与所述并行计算模块相连,用于根据计算得到的哈希值在其各自对应的位图中并行地查找;
比较模块,用于将各个位图的查表结果进行比较判断,确定出匹配的表项所在的哈希子表的地址,将该地址存储的表项的信息取出,并与需要查找的键值进行比较,判断取出的表项是否与待查找的表项相匹配,如匹配,则将该表项的信息作为最终查表结果。
本发明的有益效果是:
本发明的哈希表的表项添加方法,通过将哈希表拆分为多张哈希子表,且每一张哈希子表对应一张位图和一个哈希函数,再利用该哈希函数计算待存储表项的键值的哈希值,由该哈希值来确定存储待存储表项的空位,即由于每张哈希子表都是通过对哈希表进行拆分得到,且在位图中已经确定了匹配表项的存储地址,从而以极小的更新时间代价以及较高的表空间利用率实现全部表项存储,而无表项遗留。
本发明的哈希表查找方法,通过并行计算待查找表项键值的哈希值,并根据该哈希值到对应位图中进行查找,并将查找的结果进行对比,当第一次出现冲突位为无效时,取出该位图的地址对应的哈希子表中的表项;将其与带查找表项进行对比,如果相匹配,则该表项即为待查找的表项,由于每张哈希子表都是通过对哈希表进行拆分得到,且在位图中已经确定了匹配表项的存储地址,从而只需访问一次哈希子表就能够准确的查找到需要的表项,同时也便于硬件与存储器之间接口的实现,能够在表空间大小,查找效率以及硬件实现方面获得比较好的均衡。
附图说明
图1为本发明的哈希表存储装置的一实施例的结构示意图;
图2为本发明的表项存储模块的一实施例的结构示意图;
图3为本发明的哈希表存储装置的一具体实施例的结构示意图;
图4为本发明的哈希表的表项添加方法的一实施例的流程图;
图5为本发明的哈希表的表项添加方法的步骤S407的一实施例的流程图;
图6为本发明的哈希表的表项添加方法的步骤S409b的一实施例的流程图;
图7为本发明的哈希表的表项删除方法的一实施例的流程图;
图8为本发明的哈希表查找方法的一实施例的流程图;
图9为本发明的哈希表的一实施例的逻辑结构图;
图10为本发明的哈希表的表项添加的一具体实施例的流程图;
图11为本发明的查找哈希表的一实施例的逻辑结构示意图。
具体实施方式
下面通过具体实施方式结合附图对本发明作进一步详细说明。
请参考图1,为本实施方式的哈希表存储装置的一实施例的结构框图。本实施方式的哈希表存储装置包括主控逻辑模块100,以及与主控逻辑模块100相连的控制线路和数据线路,其中,主控逻辑模块100控制控制线路完成表项的添加和/或删除,控制数据线路完成表项查找,其中控制线路包括:表项拆分模块101,目标哈希子表确定模块102和表项存储模块103,其中,表项拆分模块101,目标哈希子表确定模块102和表项存储模块103,其中,表项拆分模块101,用于将哈希表拆分为多张哈希子表和多张位图,且每张哈希子表对应一张位图和一个哈希函数;目标哈希子表确定模块102与表项拆分模块101相连,用于将表项拆分模块101拆分得到的多张哈希子表中的第一张哈希子表作为当前的目标哈希子表,并当接收到表项存储模块103发出的更新指令后,用于将当前的目标哈希子表更新为其下一张哈希子表;表项存储模块103,与目标哈希子表确定模块102相连,用于利用当前目标哈希子表所对应的哈希函数,计算待存储表项的键值的哈希值,并根据该哈希值确定当前目标哈希子表所对应的存储位置是否为空位,如是,将待存储表项的信息存入该空位,否则向目标哈希子表确定模块102发送更新指令,直至查找到空位存储待存储表项。
请参考图2,为本实施方式的表项存储模块的一实施例的结构示意图。本实施方式中的位图包含冲突位和有效位。本实施方式中表项存储模块包括计算子模块200、查找子模块201、表项添加子模块203,其中,计算子模块200,与目标哈希子表确定模块相连,用于利用当前目标哈希子表所对应的哈希函数,计算待存储表项的键值的哈希值;查找子模块201,与计算子模块200相连,用于判断该目标哈希子表确定模块计算的哈希值的位数是否大于等于当前目标哈希子表的容量,如是,则截取该哈希值,并将截取后的哈希值作为索引,查找相应的位图,并判断查找到的位图的有效位是否有效,且冲突位是否为无效,如是,则判定该目标哈希子表中的存储位置为空位,否则,则向目标哈希子表确定模块发送更新指令,直至查找到空位;表项添加子模块202,与查找子模块201相连,用于当查找子模块201在当前目标哈希子表中查找到空位时,将待存储表项的信息存入空位中,并将该位图的有效位置为无效,将待存储表项的键值存储到该位图中,而当查找子模块201判断出该位图的有效位为无效时,还用于判断该位图的冲突位是否为无效,如是,则表项添加子模块用于将位图对应哈希子表中已存储的表项取出,并将取出的表项的键值与当前待存储表项的键值存入到位图中;当查找子模块201判断出位图的冲突位为有效时,则表项添加子模块202用于将当前的待存储表项的键值存储到该位图中。
本实施方式中的每张位图包含了一位冲突位和一位有效位,多个冲突键值存储槽位。本实施方式中的位图的有效位置为0,即表示有效,置为1,即表示无效;位图的冲突位置为0则表示无效,置为1则表示有效。
请参考图1,本实施方式中的哈希表存储装置的数据线路包括并行计算模块301,并行查找模块302以及比较模块303,其中,并行计算模块301,用于利用每张哈希子表对应的哈希函数,并行计算待查找表项的键值的哈希值;并行查找模块302,与并行计算模块301相连,用于根据计算得到的哈希值在其各自对应的位图中并行地查找;比较模块303,用于将各个位图的查表结果进行比较判断,确定出匹配的表项所在的哈希子表的地址,将该地址存储的表项的信息取出,并与需要查找的键值进行比较,确定表项是否匹配,如匹配,则将该表项的信息作为最终查表结果。
本实施方式中查找表项时的哈希子表对应的位图与存储表项时,哈希子表对应的位图深度相同;且哈希子表对应的哈希函数与存储表项时,该哈希子表对应的哈希函数相同。本实施方式中查找表项时,对应的位图只包含一位的冲突位。
本实施方式的哈希表存储装置通过表项拆分模块将哈希表拆分为多张哈希子表,再由目标哈希子表确定模块从其中确定一张目标哈希子表,并由表项存储模块利用目标哈希子表对应的哈希函数计算待存储表项的键值对应的哈希值,并根据该哈希值才目标哈希子表中查找空位,从而将待存储表项存入该空位中,当没有查找到空位时,则将待存储表项的键值存储在对应的位图中,并更新目标哈希子表直至找到空位来存储该待存储表项,从而以极小的更新时间代价以及较高的表空间利用率实现全部表项存储,而无表项遗留;另一方面本装置通过并行计算模块来并行计算待查找表项的键值对应的哈希值,再由并行查找模块根据该哈希值在各自对应的位图中查找,最后由比较模块来比较查找结果,并匹配表项所在的哈希子表地址中取出对应的表项,如果该表项与待查找的表项相匹配,则该表项即为待查找的表项,则将其作为最终的查找结果返回,从而由于每张哈希子表都是通过对哈希表进行拆分得到,且在位图中已经确定了匹配表项的存储地址,从而只需访问一次哈希子表就能够准确的查找到需要的表项,同时也便于硬件与存储器之间接口的实现,能够在表空间大小,查找效率以及硬件实现方面获得比较好的均衡。
实施例一:
请参考图3,为本实施方式的哈希表存储装置的一实施例的结构示意图。本实施方式的哈希表存储查找系统包括主控逻辑模块505,多个计算模块502a~502n,多个查找模块503a~503n,表项添加模块504,统计模块505,表项拆分模块506,多个bitmap模块507a~507n,多个表项存储模块508a~508n,数据判决模块509和异常处理模块550。本实施方式的哈希表存储装置的内部连接分为数据线路和控制线路,在数据线路上,主控逻辑模块501耦合至多个计算模块502a~502n,数据判决模块509;多个计算模块502a~502n分别耦合至多个查找模块503a~503n;多个查找模块503a~503n分别耦合至多个bitmap模块507a~507n,多个bitmap模块507a~507n耦合至多个表项存储模块508a~508n;在控制线路上,主控逻辑模块501耦合至表项添加模块504,统计模块505,表项拆分模块506和异常处理模块510,且表项添加模块504,统计模块505,表项拆分模块506和异常处理模块510均分别耦合至多个查找模块503a~503n。
其中,主控逻辑模块501,是哈希表存储装置的控制部件,主要用于控制控制线路和数据线路上的算法启动,终止,任务调度以及数据路径上的数据分发,结果收集等操作。
本实施方式中的主控逻辑模块501可以由硬件逻辑实现,如ASIC(专用集成电路)或者是FPGA(现场可编程逻辑门阵列)或者是其他可以实现逻辑函数功能的芯片。当然本实施方式中的主控逻辑模块501也可以通过运行在CPU(中央处理)上的软件来实现,在这种实现方式下,控制线路上的模块,包括表项添加模块504,统计模块505,表项拆分模块506和异常处理模块550,且均可以通过软件来实现。
多个计算模块502a~502n耦接至主控逻辑模块501和多个查找模块503a~503n,在表项查找过程中,当主控逻辑模块501将待查找的键值同时发送给多个计算模块502a~502n时,该多个计算模块502用于对所分配到的键值同时进行一次哈希运算,获得与其他计算模块不同的索引。
本实施方式中的每个计算模块502中包含一个与其他计算模块502不同的哈希函数,且本实施方式中的哈希函数可以采用各种已知的方法实现,如异或阵列或者类CRC函数,或者经过复杂的数学运算等等。哈希函数的选取准则是要尽可能的减少不同的键值经过哈希函数运算后获得的索引号冲突。
多个查找模块503a~503n分别耦合至多个计算模块502a~502n和多个bitmap模块507a~507n,以及统计模块505,表项拆分模块506和异常处理模块110。本实施方式中的每个查找模块503独立的耦合于一个bitmap模块507,通过bitmap模块507的地址总线和数据总线对bitmap模块507以及该bitmap所对应的存储模块508中的数据进行访问和修改。在数据线路上,每个查找模块503接收计算模块502生成的不同的索引,并将其转换成bitmap模块507的地址,从而读取该地址对应于存储模块508中的数据。在获取到对应于该地址的数据后,查找模块503将接收的多个计算模块502a~502n计算得到的索引值和多个bitmap模块507a~507n获取的数据值,一起传送给数据判决模块509与查找键值比较,确定是否匹配;在控制线路上,多个查找模块503a~503n接收统计模块505,表项拆分模块506和异常处理模块509发出的读写指令,转换成多个bitmap模块507a~507n的地址,对多个bitmap模块507a~507n中的存储数据进行操作,进而对多个存储模块508a~508n中存储的数据进行操作。
本实施方式中的查找模块503同时实现控制线路和数据线路的功能,当然也可以分别针对控制线路和数据线路设置相应的查找模块。本实施方式中可以存在索引值的扩充,加减偏移量或者截取等运算。
多个bitmap模块507a~507n分别耦合于多个查找模块503a~503n,且每个bitmap模块507具有独立的地址访问总线和独立的数据总线,对每一个模块而言,地址总线和数据总线可以复用,但是多个存储模块508之间不复用,多个bitmap模块507a~507n通过上述的独立的地址访问总线和独立的数据总线分别耦合于多个查找模块503a~503n,多个查找模块503a~503n通过发送地址来访问多个bitmap模块507a~507n中对应于所发送地址处存储的数据(冲突位,有效位和键值),且该多个bitmap模块507a~507n还分别对应一个存储模块508a~508n,每个存储模块508存储一张哈希子表,每张子表都是通过表项拆分模块506对哈希表进行拆分得到,且在bitmap模块507中已经确定了匹配表项的存储地址,只需访问一次存储模块508a~508n,所以存储模块508a~508n共享一组地址访问总线和数据总线。
多个bitmap模块507a~507n分别耦合于所述多个查找模块503a~503n。其中每个bitmap模块具有独立的地址访问总线和独立的数据总线,其中对每一个模块而言,地址总线和数据总线可以复用,但是多个表项存储模块之间不复用。多个bitmap模块507a~507n通过上述的独立的地址访问总线和独立的数据总线分别耦合于多个查找模块503a~503n,多个查找模块503a~503n可以通过发送地址来访问多个bitmap模块507a~507n中对应于所发送地址处存储的数据(冲突位,有效位和键值)。多个bitmap模块507a~507n分别对应一个表项存储模块508a~508n,每个表项存储模块存储一张哈希子表,其中每张子表都是通过对所述哈希表进行拆分得到,因为在bitmap中已经确定了匹配表项的存储地址,只需访问一次表项存储模块508a~508n,所以表项存储模块508a~508n共享一组地址访问总线和数据总线。
本实施方式中的多个bitmap模块507和存储模块508可以通过当前存在的各种数据存储技术来实现。由于bitmap模块507需要并行访问且占用的存储空间比较小,可以用片内SRAM实现。而对于存储模块508,如在需要少延时的应用场景下,可以用n个独立的高速SRAM芯片来作为存储模块508a~508n,所述的高速SRAM芯片可以是ZBT SRAM,QDR SRAM,QDRII SRAM,QDRII+SRAM等各种常用的SRAM芯片;在需要大容量表项空间的情况下,可以用n个独立的高速DRAM芯片来作为存储模块508a~508n,所述的高速DRAM芯片可以是SDRAM,DDR SDRAM,DDRII SDRAM,DDRIII SDRAM等各种常用的SDRAM芯片;在需要掉电保存数据的情况下,可以用n个独立的FLASH芯片来作为存储模块508a~508n,所述的FLASH芯片可以是NAND FLASH,NOR FLASH,NV RAM或者其他各种常用的存储芯片;在海量数据的情况下,存储模块508a~508n还可以用多个独立的硬盘,多个独立的磁盘存储阵列,或者是光盘驱动器等海量数据存储技术来实现,也可在不脱离本实施方式的范围下任意选取多个bitmap模块507a~507n和存储模块508a~508n的实现介质。
数据判决模块509,耦合至多个查找模块503a~503n和多个存储模块508a~508n,完成查找结果的判决操作。多个查找503a~503n,在获取了多个bitmap模块507a~507n查找结果后,将结果传送至数据判决模块509,数据判决模块按a~n顺序比较bitmap模块507a~507n的查找结果,找出最先冲突位为0的bitmap模块507,将找到的bitmap地址传送给多个存储模块508a~508n,从存储模块508中获取到的数据再传送给数据判决模块509,根据主控逻辑模块501传送过来的原始键值,比较该数据是否是匹配的表项,由于多个查找模块103a~103n获取的多个查找结果来自于多个bitmap模块107a~107n中存储的冲突位,而冲突位只有当其不与其他表项冲突时才会置0,若有一次冲突就将其置1,所以最先出现的冲突位为0的地址对应的表项存储模块中存储的数据是唯一的,因此,这当中不存在重复的表项,只有一个查找存储模块508的结果是可能的正确结果,或者返回的结果均与键值不符,本次哈希查找失败。在查找正确的情况下,数据判决模块509将正确的一组数据中的索引值返回给主控逻辑模块501,代表本次哈希查找的结果;在查找失败的情况下,数据判决模块509将返回给主控逻辑模块501一个无效索引值或者一个中断信号,通知主控逻辑模块501本次查找失败。
表项拆分模块506和表项添加模块504协同工作,用于将哈希表拆分为N(N>=1)张哈希子表并存入到多个存储模块508中。每张哈希子表对应一张bitmap和一个哈希函数,其中N张哈希子表和N张bitmap的存储空间大小可以根据需要进行选择。
本实施方式中的哈希表包含M个条目(M可以是从1到很大的条目数,如2的32次方),哈希子表生成过程中,表项拆分模块506依次选取M个条目中的一个,将其目标哈希子表和bitmap设定为第一张哈希子表和bitmap,并将该条目传送给表项添加模块504。表项添加模块104根据第一张哈希子表对应的哈希函数,计算得出该条目的索引值K,并尝试将该条目存入所取的哈希函数对应的哈希子表中的对应于索引值K的位置,同时将与该哈希子表对应的bitmap中对应的索引值K位置中的冲突位置0,有效位置1,将原始键值存入该位置中。
本实施方式中,在表项拆分模块506对多个哈希子表进行拆分的时候,有可能遇到哈希冲突的情况,即两个不同的键值经过计算得到同一张哈希子表的同一个索引值。在这种情况下,如果该位置的bitmap冲突位为0,有效位为1,说明该位置已放入一条表项,需要将已存入该索引值对应的表项存储模块的数据取出,并将该索引值对应的bitmap中的冲突位值1,当前键值与取出表项对应的键值都放在bitmap中;如果该位置的bitmap冲突位为1,说明该位置已经冲突超过一次,将当前键值放入bitmap中。当出现上述两种冲突情况时,返回失败消息给表项拆分模块106,表项拆分模块506再判断当前的目标哈希子表是否为最后一张哈希子表,若不是则将该条目的目标子表设置为下一张子表,传递给表项添加模块504,重复上述过程;若已经是最后一张哈希子表,则返回失败消息给主控逻辑模块501,通过主控逻辑模块501调用异常处理模块509来完成哈希表的更新。
虽然本实施方式中的表项添加模块504处于控制线路上,但是可以通过多个查找模块503a~503n读取或修改bitmap模块507和存储模块508中的内容。
异常处理模块110和统计模块105分别耦合至多个查找模块503和主控逻辑模块501,完成系统监控和错误恢复等任务。如每次查询失败,统计模块505均会将其计入到查找失败记录。异常处理模块510则用于响应主控逻辑模块501发出的哈希表刷新请求,并通过多个查找模块503a~503n对多个Bitmap模块107a~107n和多个存储模块108a~108n进行清零和重新赋值操作。
下面将本实施例的哈希表存储装置拆分成数据线路和控制线路两个部分来进行详细的说明。
其中,数据线路由主控逻辑模块501,多个计算模块502a~502n,多个查找模块503a~503n,多个Bitmap模块507a~507n,多个存储模块508a~508n以及数据判决模块509构成,该数据线路用来完成查找操作,
控制线路由主控逻辑模块501,表项添加模块504,统计模块505,表项拆分模块506和异常处理模块510构成。表项添加模块504耦合至多个查找模块503,用于将冲突状态信息和表项数据添加进多个bitmap模块507a~507n和多个存储模块508a~508n,该控制线路用来完成表项添加和删除操作。
本实施例的哈希表存储装置中,拆分后得到的哈希子表对应的N个哈希函数可以是CRC函数也可以是其他函数,当采用CRC函数做为本实施例中哈希子表对应的哈希函数时,若干张哈希子表对应的哈希函数之间可以采用不同的CRC多项式。
基于上述的哈希表存储装置,本实施方式还提供一种哈希表的表项添加方法。
请参考图4,为本实施方式的哈希表的表项添加方法的一实施例的流程示意图。本实施方式哈希表的表项添加方法包括:
S401,哈希表拆分为多张哈希子表,每一张哈希子表对应一张位图,每一张位图对应一个哈希函数。
本实施方式中拆分的关键影响因素是每张子表的存储空间大小选择。本实施方式中的多张哈希子表的存储空间可以根据需要搭配选择,比如可以设置每张小表空间大小一致,也可以采用存储空间大小递减的方式,但是,拆分方式不局限于上述两种方式。
S403,将第一张哈希子表作为当前的目标哈希子表。
S405,取待存储表项的键值,利用当前目标哈希子表对应的哈希函数计算其哈希值。
S407,根据计算得到的哈希值,确定当前目标哈希子表所对应的存储位置是否空位,如是,则执行步骤S409a,否则,执行步骤S409b。
S409a,将待存储表项的信息进存入该空位中,并执行步骤S4011。
本实施方式中的表项的信息包括查表键值、查表结果等信息。
S409b,更新当前目标哈希子表并执行步骤S405。
S4011,将该位图中的有效位置为无效,并将待存储表项的键值存储到该位图中。
S4013,待存储表项存储完成后,同步更新位图的冲突位信息和哈希子表的信息。
请参考图5,为本实施方式的步骤S407的一实施例的流程图。本实施方式中的步骤S407包括:
S501,判断当前目标哈希子表的容量是否小于计算的哈希值,如是,则执行步骤S503a,否则执行步骤S503b。
S503a,根据哈希子表的容量对应的比特位数,从高比特位开始截取计算得到的哈希值的相同比特位数,得到截取后的哈希值,并将该截取后的哈希值作为索引,执行步骤S505。
S503b,直接以计算得到的哈希值作为索引。
S505,根据索引在目标哈希子表中查找空位,即判断该位图的有效位是否为0,且该位图的冲突位为0,如是,即该目标哈希子表对应的存储位置为空位,则执行步骤S409a;否则执行步骤S409b。
请参考图6,本实施方式中的步骤S409b包括:
S601,判断该位图的冲突位是否为0,有效位是否为1,如是,则执行步骤S603a,如果该位图的冲突位为1,则执行步骤S603b。
S603a,将该位图对应哈希子表中已存储的表项取出,并将该位图的冲突位置为1,并执行步骤S605。
S603b,将当前的待存储表项的键值存储到该位图中,执行步骤S607。
S605,将取出表项的键值与当前待存储表项的键值存入到该位图中。
S607,判断当前目标哈希子表是否为最后一张哈希子表,如是,执行步骤S609a,否则执行步骤S609b。
S609a,返回存储失败消息,结束操作。
S609b,将目标哈希子表更新为下一张哈希子表,并执行步骤S405。
本实施方式的哈希表的表项添加方法中,哈希子表对应的哈希函数为循环冗余码校验函数,且多张哈希子表对应的哈希函数之间采用不同的循环冗余码校验多项式。
本实施方式的哈希表的表项添加方法,通过将哈希表拆分为多张哈希子表,且每一张哈希子表对应一张位图和一个哈希函数,再利用该哈希函数计算待存储表项的键值的哈希值,由该哈希值来确定存储待存储表项的空位。由于每张哈希子表都是通过对哈希表进行拆分得到,且在位图中已经确定了匹配表项的存储地址,从而以极小的更新时间代价以及较高的表空间利用率实现全部表项存储,而无表项遗留。
本实施方式还提供一种哈希表的表项删除方法。本实施方式中的哈希表包括多张哈希子表,每一张哈希子表对应一张位图,每一张位图对应一个哈希函数,且每张所述位图包括多个条目。请参考图7,本实施方式的哈希表存储装置的表项删除方法,包括:
S701,每张位图所对应的哈希函数并行计算需要删除的条目的哈希值。
S703,根据计算得到的哈希值,在其各自对应的位图中并行查找。
S705,将每一张位图的查找结果顺序进行比较,当第一次出现冲突位为无效时,将该位图的地址对应的哈希子表中的表项取出。
S707,将取出的表项的键值与需要查找的键值进行比较,如果相同,则执行步骤S709。
S709,将该表项从哈希子表中删除。
S7011,将对应的位图的冲突位置为0,有效位置为0。
S7013,将删除的表项所在的位图之前的所有位图中的所存储的所有键值进行比较,如果某个位图中所存储的键值大于两个,则执行步骤S7015a,如果某个位图中所存储的键值等于两个,则执行步骤S7015b。
S7015a,直接将需要删除的键值删掉,结束。
S7015b,将需要删除的键值删掉,并查找到另一个键值所存储的位置。
S7017,将另一个键值对应的表项取出,存入该位图所对应的哈希子表中。
本实施方式还提供一种哈希表查找方法,本方法中查找的哈希表由若干张哈希子表组成,若干张哈希子表的存储空间大小可以根据需要搭配选择。每张bitmap具有独立的地址控制线,可以同时被访问,所有的哈希子表共享一组地址控制线,每一条表项查找只访问一次哈希子表。每张哈希子表对应一个哈希函数,每张哈希子表对应的哈希函数与存储表项时该哈希子表对应的哈希函数相同。
请参阅图8,该图为本实施方式的哈希表查找方法的实现原理流程图。本实施方式的哈希表查找方法主要包括以下步骤:
S801,利用多个哈希子表对应的多个哈希函数并行计算待查找表项的键值对应的哈希值。
S803,根据计算得到的哈希值在对应的位图中并行查找。
S805,将每一张位图的查找结果顺序进行比较,当第一次出现冲突位为0时,取出该冲突位所对应位图的地址对应的哈希子表中的表项。
S807,将取出的表项的键值与待查找表项的键值进行比较,如果取出的表项的键值与所述待查找表项的键值相匹配,则执行步骤S809a,否则,执行步骤S809b。
S809a,将该表项的信息作为最终查表结果。
S809b,返回查找失败的消息。
本实施方式中步骤S805包括:根据计算得到的哈希值对应的哈希子表的容量,对该哈希值进行截取;将截取后的哈希值作为索引,在其对应的位图以及哈希子表中并行查找。
本实施方式的哈希表查找方法,通过并行计算待查找表项键值的哈希值,并根据该哈希值到对应位图中进行查找,并将查找的结果进行对比,当第一次出现冲突位为无效时,取出该位图的地址对应的哈希子表中的表项;将其与带查找表项进行对比,如果相匹配,则该表项即为待查找的表项,由于每张哈希子表都是通过对哈希表进行拆分得到,且在位图中已经确定了匹配表项的存储地址,从而只需访问一次哈希子表就能够准确的查找到需要的表项,同时也便于硬件与存储器之间接口的实现,能够在表空间大小,查找效率以及硬件实现方面获得比较好的均衡。
实施例二:
请参阅图9,该图为本实施方式的哈希表的一实施例的逻辑结构图,每个哈希子表对应于一张bitmap和一个哈希函数,其中输入键值通过输入接口输入到本实施方式的哈希子表中,通过哈希表存储装置计算输入键值的哈希值,以该哈希值作为索引在bitmap和哈希子表中查找空位并填入;其中bitmap0~9是10个大小相同的,存储深度为m的状态表,哈希子表0~9是10个大小相同的,存储深度为m的存储器。
本实施例中的哈希表存储装置用于根据用户请求完成对输入键值的全部操作,包括添加、查找、监控、异常处理等。请参考图3,当哈希键值输入主控逻辑模块501,由主控逻辑模块501选择哈希函数,并利用该哈希函数通过哈希计算逻辑计算得到对应的哈希值,添加表项逻辑模块504完成添加表项的工作,查找逻辑模块503完成对指定哈希键值的查找工作。本实施例的哈希表存储装置还包括删除表项逻辑模块,和监控逻辑模块,均未在附图中画出。其中删除表项逻辑模块完成删除表项的工作;监控逻辑模块监控在添加和删除表项的过程中哈希子表中的空间占用情况,并将此信息反馈给主控逻辑模块501。
本实施例中,如果遍历了所有哈希子表都无法将某一表项添加进哈希表的异常处理情况时,需要异常处理逻辑510来进行处理,以最大程度实现所有表项的添加入哈希表中。
请参阅图10,该图为本实施方式的一种哈希表的表项添加方法的一具体实施例的流程图,包括以下步骤:
S1001,利用第i张哈希子表对应的哈希函数,即CRC16函数,计算待存储表项的键值的16bit哈希值。
本实施例中i的初始值是0,取值范围是0-9。
S1003,判断第i张哈希子表的表容量是否小于计算的哈希值,如是,则执行步骤S1005a,否则执行步骤S1005b。
S1005a,对计算得到的16bit哈希值从高比特位开始进行截取,并以截取后的哈希值作为索引,执行步骤S1007。
S1005b,以计算得到的哈希值作为索引。
S1007、根据索引值在第i张哈希子表中查找是否有空位,即判断对应的bitmap中冲突位为0,有效位为0,若是执行步骤S1009,否则,执行步骤S1011。
S1009,将待存储表项所对应的所有信息放入查找到的空位中,将其对应的bitmap中冲突位置0,有效位置1。
至此,本条表项计算、存储过程结束,开始存储下条表项。
S1011,如果该位图的冲突位为0,且有效位为1,即该地址已存储一条表项,则执行步骤S1012;如果该位图的冲突位为1,则执行步骤S1013。
S1013,将该存储的表项取出,将当前键值与取出的表项键值存入到bitmap中,且冲突位置1,执行步骤S1017。
S1013,将当前键值存入对应的bitmap中。
S1015,i=i+1,返回步骤S1001,即开始在下一张表中查找空位,直到找到空位存储该条表项为止。
请参阅图11,该图为本实施方式中的一种查找表项的一种实施例的逻辑结构图,对于一个需要查找的哈希键值,首先经过哈希函数0~9并行计算出哈希值,这里的每个哈希函数必须与存储表项时所用的哈希函数相同;然后利用计算得到的哈希值作为索引值分别在各自对应的bitmap表中并行地查找,确定出匹配表项的地址,将该地址传送给哈希子表存储器取出表项,各个哈希子表存储器还留有一个端口用作CPU访问;最后,将取出的表项与需要查找的键值比较,确定匹配后,将该项所有的信息作为最终的查表结果返回给用户,至此查表过程结束。
由于在查找时是对所有10张bitmap表进行并行查找,那么只需要一个查找周期和一个周期读取哈希子表存储器就能实现全部命中,这样就实现了在保证无表项遗留的前提条件下,以比较小的片内表空间容量和一个存储器接口,实现快速的哈希查找。
实施例三:
请参阅图9,该图为本实施方式中的哈希表的一实施例逻辑结构图,其中输入键值通过输入接口输入到本实施例的哈希子表中,通过哈希表控制器对输入键值计算其哈希值,以该哈希值作为索引在哈希子表中查找空位并填入;其中哈希子表0~9是10个存储器,代表10张哈希子表,bitmap0~9是10个状态表,但本实施例中的10个存储器中的前4个的存储深度为m,而后6个的存储深度为m/2。
本实施例中哈希表控制器的逻辑结构,哈希表的存储、查找流程,以及查找表项的逻辑结构与实施例二中完全一致。
与实施例二相比,实施例三的空间利用率更高。
以上内容是结合具体的实施方式对本发明所作的进一步详细说明,不能认定本发明的具体实施只局限于这些说明。对于本发明所属技术领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干简单推演或替换,都应当视为属于本发明的保护范围。