首页> 中国专利> 一种基于完美哈希算法的FPGA训练及查询电路实现方法

一种基于完美哈希算法的FPGA训练及查询电路实现方法

摘要

本发明公开了一种基于完美哈希算法的FPGA训练及查询电路实现方法,包括以下步骤:创建静态键值表;将静态键值与真随机数作一阶哈希计算映射到一阶哈希表;将一阶哈希表中冲突于同一槽位的静态键值组成一个冲突组复制到键值重排表中相邻位置;将冲突组进行二阶哈希计算,得到冲突组映射地址索引值互异的二阶哈希表;查询静态键值的序号时,在所述一阶哈希表和/或二阶哈希表,查找静态键值的地址索引值,读取静态键值的序号,通过序号查询可以输出哈希索引号。利用FPGA强大流水线计算能力,将冲突组到二阶哈希表中的映射空间大小,由初始设置的大于或等于冲突数的最小的2的整数次幂,通过尝试逐渐放宽,这将大大节约二阶哈希表的容量。

著录项

  • 公开/公告号CN107330047A

    专利类型发明专利

  • 公开/公告日2017-11-07

    原文格式PDF

  • 申请/专利权人 华信塞姆(成都)科技有限公司;

    申请/专利号CN201710508277.9

  • 发明设计人 邓俊杰;

    申请日2017-06-28

  • 分类号

  • 代理机构成都君合集专利代理事务所(普通合伙);

  • 代理人张鸣洁

  • 地址 610041 四川省成都市高新区天华一路99号天府软件园B区8栋

  • 入库时间 2023-06-19 03:42:57

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2020-06-30

    授权

    授权

  • 2017-12-01

    实质审查的生效 IPC(主分类):G06F17/30 申请日:20170628

    实质审查的生效

  • 2017-11-07

    公开

    公开

说明书

技术领域

本发明涉及大规模静态数据查询领域,尤其涉及FPGA查询电路设计领域,具体的说,是一种基于完美哈希算法的FPGA训练及查询电路实现方法。

背景技术

现有技术中,常见的查询方式是采用哈希算法根据键值查询索引值,对于静态数据结构,人们通常采用完美哈希以解决冲突问题,即采用两级哈希运算的方式:先进行第一级哈希,找出冲突至同一槽位的键值;针对每一组冲突至同一槽位的键值组,用全域哈希方式找到一个哈希函数,使得这些键值的哈希值没有冲突。这些被解决了一阶冲突的键值将组成二阶哈希。现有的完美哈希方法多针对软件实现,其计算基于实数域,需要用到素数的乘(或)除法,并且现有完美哈希方法,对于每一组冲突到同一槽位的键值(假设数量为N),需要设置对应的二级哈希表的大小为N的平方。这将造成二级的哈希表格规模过大,这在集成电路,特别是FPGA中实现是不经济且效率低下的。

发明内容

本发明的目的在于提供一种基于完美哈希算法的FPGA训练及查询电路实现方法,用于解决现有技术中采用FPGA实现二阶哈希规模较大且效率低下的问题,本发明中的FPGA模块实现了采用给定的静态键值表,生成完美哈希结构,对于任意给定的键值,可以查询到一个唯一的、用户预先设置的无冲突的索引号。

为了达到上述目的,本发明通过下述技术方案实现:

一种基于完美哈希算法的FPGA训练及查询电路实现方法,包括以下步骤:

S1)将静态键值和静态键值的哈希索引值输入静态键值表;

S2)将静态键值与输入的一个真随机数作一阶哈希计算得到一阶哈希表,所述一阶哈希表的表项包括:

地址/索引:在对静态键值重新排列阶段,表示静态键值在生成的键值重排表的基地址;在二阶哈希训练完成后即一阶哈希表中的冲突组解决后,如果vld=1,col=0,表示静态键值的序号;如果vld=1,col=1,表示静态键值的序号存放在二阶哈希训练生成的二阶哈希表中的基地址;

vld:1比特,有效指示,vld=1时表示至少有一个键值经过一阶哈希运算映射到这个表项上;

col:1比特,当vld=1,col=1的时候表示有几个键值冲突到此表项上;当vld=1,col=0时表示只有一个键值映射到这个表项上;

col_cnt:冲突组冲突计数,每当有一个键值被映射到这个槽位,则将此计数值加1,每当有一个冲突在此槽位上的键值被复制进入键值重排表,则计数值减1;

col_rec:冲突组冲突数记录,每当有一个键值被映射到这个冲突组的槽位,则将此计数值加1;

函数池索引:如果一阶哈希表中此槽位没有冲突,则为空,如果存在冲突则存放二阶哈希训练过程中的哈希函数的索引;

CRC size:映射到这个槽位的所有键值在进行二阶哈希时,采用CRC本原多项式的长度;

S3)读取静态键值表的每一个静态键值并查找一阶哈希表,将冲突于同一槽位的静态键值复制到键值重排表,使在一阶哈希表中冲突于同一槽位的静态键值在键值重排表中的位置相邻;

S4)遍历查询一阶哈希表,根据过一阶哈希表中的冲突信息将冲突到一阶哈希表中相同槽位的所有键值从键值重排表中读取出来,这些键值对应为一阶哈希表的一个冲突组,进行二阶哈希计算,使所述冲突组映射到二阶哈希表中不同的地址索引值;

S5)再次遍历原始键值表,将某一键值keyi进行一阶哈希计算,其中i为自然数,计算结果对应一阶哈希表中的一个地址,如果此地址的表项显示col=0,则查询下一个原始键值keyi+1,否则,结合一阶哈希表中的信息进行二阶哈希计算,计算结果为其在二阶哈希表中的地址,将i填入二阶哈希表的表项,然后查询下一个原始键值keyi+1

S6)查询静态键值的序号或地址索引时,在所述一阶哈希表和/或二阶哈希表,查找静态键值的序号,根据序号读取原始键值表的原始键值与哈希索引值,输入查询的键值与原始键值对比,如果相等,则输出哈希索引值;否则,查询失败。

所述步骤S2)中由静态键值表通过一阶哈希计算生成一阶哈希表的过程由一阶哈希训练模块来完成,一阶哈希训练模块由FPGA来实现。所述一阶哈希训练模块用于使静态键值表中的每一个静态键值映射到一阶哈希表的一个槽位。经过一阶哈希计算之后,映射到一阶哈希表同一槽位的静态键值组成一个冲突组,需要进行二阶哈希计算,使冲突到同一槽位的静态键值映射到二阶哈希表中不同的地址索引值,即使每个静态键值都能映射到一阶哈希表或二阶哈希表中的一个唯一无冲突的地址索引值。所述步骤S3)中的键值重排用FPGA重排控制模块实现键值重排表,用于将一阶哈希表中冲突到同一槽位的静态键值重新排列,将冲突到同一槽位的静态键值写入键值重排表相邻的位置。所述步骤S4)读取键值重排表中的静态键值,并在一阶哈希表中查找冲突组的信息,进行二阶哈希计算,找到一个使静态键值映射到二阶哈希表中地址索引互不冲突的函数,函数由一个参与有限域计算的真随机数以及一个CRC本原多项式组成。将真随机数装入哈希函数池,并将此函数的位置与CRC本原多项式的项数记入一阶哈希表;查询静态键值的序号时,可以通过查找一阶哈希表或二阶哈希表找到静态键值的序号。值得说明的是,所述的表包括一阶哈希表、二阶哈希表、原始键值表、键值重排表等是在FPGA中的BRAM中实现的。

优选地,所述骤S2)具体为:

S2.1)清空一阶哈希表,使一阶哈希表初始状态全为0;

S2.2)将静态键值表中的第一个静态键值与输入的一个真随机数进行一阶哈希计算,得到一阶哈希表的地址索引值,将静态键值的序号写入一阶哈希表所述地址索引值对应的表项中的地址/索引,将所述表项的col_cnt与col_rec写入“1”,将所述表项的有效指示vld写入“1”;

S2.3)读取下一个静态键值,进行一阶哈希计算,得到静态键值对应的一阶哈希表的地址索引值,读取该地址索引值对应的表项的有效指示vld,如果有效指示vld为“1”,则将该表项的col_cnt和col_rec均加“1”,将所述表项的col置为“1”,清空地址/索引的内容;如果该表项的有效指示vld为“0”,则将该表项的col_cnt和col_rec均置为“1”,将所述表项的有效指示vld写入“1”,并且将静态键值的序号写入表项的地址/索引;判断col_cnt与col_rec的数值,如果数值大于预先设定的最大冲突数,则重新选择一阶哈希计算的参数即输入的一个真随机数,并返回S2.1);

S2.4)重复步骤S2.3),直到完成遍历静态键值表。

将静态键值映射到一阶哈希表,将在一阶哈希表中没有冲突的静态键值的序号存至一阶哈希表的地址/索引中,在一阶哈希表中采用表项的col_cnt和col_rec的值来判断静态键值映射到一阶哈希表中是否存在冲突,如果存在冲突,则需要进行二阶哈希计算。如果col_cnt和col_rec的数值大于预先设定的最大冲突数即一阶哈希计算有误,需要更改一阶哈希计算中,参与有限域的真随机数,并返回S2.1),此处所述最大冲突数为设定电路时候预先确定的一个参数,这个参数需要根据键值的数量以及一阶哈希表的深度,通过软件模拟或者经验值来设定一个合适的数值。

优选地,所述步骤S3)具体为:

S3.1)设置FPGA内部计数器base_addr_cnt为0,读取静态键值表中的第一个静态键值,从一阶哈希表读取该静态键值对应的地址索引值的表项中的col,如果col等于0,则所述静态键值未产生冲突,直接读取下一个静态键值;否则,将一阶哈希表中该静态键值对应的表项的地址/索引写入base_addr_cnt=0作为键值重排表中的基地址,更新base_addr_cnt=base_addr_cnt+col_rec,并将0+col_cnt-1作为所述静态键值在重排表中的绝对地址,复制所述静态键值至所述绝对地址,同时将一阶哈希表中该静态键值对应的地址索引值的表项的col_cnt减1;

S3.2)从静态键值表中的第二个静态键值开始,读取第i个静态键值(i为≥2的整数),在一阶哈希表中读取第i个静态键值的地址索引值对应的表项信息,如果col等于0,则直接读取下一个键值,否则,如果:

a)col_cnti大于1且col_cnti=col_reci

a.1)将base_addr_cnt写入该表项的地址/索引,将base_addr_cnt+col_cnti-1作为所述静态键值在键值重排表中的绝对地址,复制此静态键值至所述绝对地址;

a.2)base_addr_cnt=base_addr_cnt+col_reci

a.3)col_cnti=col_cnti-1;

b)col_cnti大于或等于1且col_reci≠col_cnti,表明该表项的地址/索引已经被写入基地址,

b.1)从表项信息的地址/索引获取基地址base_addr_temp;

b.2)将base_addr_temp+col_cnti-1作为所述静态键值在重排表中的绝对地址,复制此静态键值至所述绝对地址;

b.3)col_cnti=col_cnti-1;

S3.3)重复步骤S3.2),直到遍历所有原始键值。

将在一阶哈希表中冲突的静态键值排列在键值重排表中相邻的位置,这样二阶哈希计算模块可以从键值重排表中连续读取一个冲突组的数据。只需要读取产生冲突的静态键值,而不需要遍历静态键值表,因此大大节省了时间。

优选地,所述步骤S4)具体为:

S4.1)遍历一阶哈希表.如果当前一阶哈希表项中col=1,则根据表项信息从重排表中读取一个冲突组,将冲突的键值发送至FPGA实现的并行计算单元,所述当前工作的并行计算单元的数目与冲突组中发生冲突的键值的数目相等;

S4.2)根据所述冲突组的数目设定一个最小的L,L为CRC本原多项式的长度减1,使2L-冲突组产生冲突的键值的数目≥0;

S4.3)首先判断一阶哈希的函数池是否为空,如果为空,则直接进入S4.5)中从外部输入真随机数的尝试;否则,读取一阶哈希表的函数池索引中的真随机数;

S4.4)将真随机数与冲突组中的静态键值分别做二阶哈希计算,如果找到一个真随机数配合一个长度为L加1的CRC本原多项式计算满足一阶哈希表中冲突到同一槽位的静态键值经过二阶哈希计算映射到二阶哈希表的不同的偏移地址,即解决了这个冲突组,将所述基地址存至一阶哈希表的地址/索引中;如果此真随机数来自外部,则需先将此真随机数写入函数池,如果真随机数来自函数池,则不需要将此真随机数写入函数池,然后将真随机数在函数池的位置记录在一阶哈希表的函数池索引,将CRC的本原多项式的项数记录在一阶哈希表的CRC size;

S4.5)如果一阶哈希表中的函数池中所有的真随机数都不能解决冲突,则从外部输入真随机数尝试,重复步骤S4.4);

S4.6)如果在第S4.5)步中,尝试外部真随机数达到设定的上限,没有找到一个合适的真随机数使得冲突得以解决,则放宽CRC本原多项式的长度;

S4.7)重复步骤S4.3至步骤S4.5),直到找到一个合适的真随机数与长度为L的CRC计算方式。

根据冲突组大小K确定本原多项式,首先确定初始的CRC本原多项式项数为:ceil(log2(K))+1,其中ceil表示向上取整,L+1是本原多项式的长度,每当CRC的项数更新或者开始一次新的冲突解决,此模块首先从哈希函数池中依次读取真随机数,将这些真随机数选择进入二阶哈希计算模块,当哈希函数池被读空,采集外部真随机数送入二阶哈希计算模块。二阶哈希计算模块中有一个真随机数位置指示(cur_hash_func_deep),当前真随机数是来自于哈希函数池时,位置指示为其在哈希函数池的位置;如果真随机数来自于外部随机源,则该位置指向函数池最后一个有效位置的下一个位置。由于并行设计,本设计一个时钟周期检查一次。如果连续检查了多个时钟周期,达到设定的次数,都没有出现结果互异的情况,则向二阶哈希计算模块中的冲突控制模块发送信息,告知其增大CRC的项数即增加了冲突组映射的地址空间。冲突组中键值的数量将被翻译为CRC的项数。随机数与随机数的位置一起进入延迟模块,延迟模块包括本原多项式项数的延迟以及真随机数的延迟,用以将这两个信息与二阶哈希计算结果对齐。

优选地,S4.4)中将所述基地址存至一阶哈希表的地址/索引中的具体步骤为:

S4.4.1)如果当前一阶哈希表项在一阶哈希表中的位置为j,如果j=1,则首先设置二阶哈希表的基地址base_addr=0,进入S4.4.2);如果j≠1,则进入S4.4.2);

S4.4.2)将base_addr写入一阶哈希表表项的地址/索引中;

S4.4.3)base_addr=base_addr+2M,M=Lj

二阶哈希计算模块中的冲突解决模块检查二阶哈希计算的计算结果,如果这些结果互不相同,则锁存当前的本原多项式项数、锁存当前的随机数深度指示(cur_hash_func_deep)与真随机数本身,并记录本冲突组键值经过二阶哈希后在二阶哈希表中的基地址:base_addr。此基地址初始值为0。每当解决一个冲突组,base_addr=base_addr+2M,M=Lj

优选地,所述S5)步骤具体为:从地址0开始,遍历原始键值表,如果当前的地址为j,0<=j<=原始键值表的深度减一

S5.1)从原始键值表中读一个原键值keyj

S5.2)keyj进行一阶哈希计算,计算得到结果hash_1_addr;

S5.3)用hash_1_addr作为地址查询一阶哈希表;

S5.4)查看一阶哈希表项的内容,如果col=1,则进入下一步;否则,如果j没有达到最大值,j=j+1返回步骤S5.1);

S5.5)用一阶哈希表项中的函数索引查询出有限域计算的真随机数,用一阶哈希表项中的CRC size来选择CRC计算的本原多项式,用一阶哈希表项中的地址/索引项得到基地址;经过有限域与CRC计算得到地址偏移,与基地址相加得到二阶哈希计算得到结果hash_2_addr;

S5.6)将j值写入二阶哈希表中地址hash_2_addr的表项中;

S5.7)如果j没有达到最大值,j=j+1,返回步骤S5.1)。

在有限域计算模块中,将输入的键值和真随机数分割成相同数量的多个比特段,经过有限域的乘法和加法运算,将有域计算结果进一步做CRC运算,最后输出哈希计算结果,这样真随机数与CRC的计算方式就决定了输入的静态键值在二阶哈希计算中的映射关系,通过改变真随机数以及CRC的长度,就能得到不同的映射关系。通过概率估算以及仿真,由集成电路多次尝试,可以找到一个合适的由有限域计算的真随机数与项数较小的CRC的本原多项式两部分组成的哈希函数,使得冲突在同一槽位的静态键值在二阶哈希下互不冲突。这大大的节约二阶哈希表的容量。静态键值转换到有限域中,实数域中的算术运算由有限域计算与CRC计算代替,由FPGA查询电路实现有限域与CRC的计算,使每一个时钟周期输出一个哈希计算结果,计算效率提高几个数量级。

优选地,所述步骤S6)具体为:

S6.1)接收需要查询的键值,采用与步骤S2)中相同的静态键值和真随机数分别作一阶哈希计算得到一阶哈希表,如果该索引地址的表项的col为0,则表明没有冲突,直接输出该地址索引对应的表项中地址/索引中的内容,即静态键值的序号,进入S6.7,否则进入下一步;

S6.2)从一阶哈希表中提取一个基地址、一个CRC size与一个哈希函数池的索引;

S6.3)根据哈希函数池的索引从哈希函数池获取一个哈希函数,此哈希函数就是指有限域计算需要的训练阶段保存在函数池中的真随机数;

S6.4)将哈希函数与要查找的静态键值作有限域就计算,得到有限域计算结果,再将此结果与CRC size决定的CRC本原多项式做CRC运算,得到一个偏移地址;

S6.5)将偏移地址与基地址的和作为二阶哈希表的地址索引值;

S6.6)根据地址索引值查找二阶哈希表,找到所述二阶哈希表中存放的静态键值的序号;

S6.7)通过查询到的序号从原始静态键值表中查询出原始的键值与哈希索引值,将需要查询的键值与原始的键值做比较;如果相等,则输出哈希索引值,如果不相等,则显示查询失败。

采用FPGA查询电路查询静态键值的序号,可以采用并行计算的方法快速的查找静态键值的序号,运算速率快。

优选地,所述步骤S6)采用流水线查询电路或非流水线查询电路实现静态键值哈希索引值的查询,所述流水线查询电路用于查询在FPGA内部实现的表项;所述非流水线查询电路用于查询外部存储器中实现的表项。

流水线查询电路查询的表项包括一阶哈希表,二阶哈希表,哈希函数池,静态键值表,都在FPGA内部实现。非流水线查询电路比流水线查询减少了两个延迟模块,如果一阶哈希计算结果不需要进行二阶哈希计算,则直接关闭二阶哈希计算过程。在非流水查询方式下,每次查询键值的索引值,需要等到查询结果返回才开始下一次查询过程。非流水线查询电路适合外部存储器接口,从而使得对于几个表项的查询在时间上不冲突。

优选地,所述步骤S6)具体为:

Q1)接收需要查询的静态键值,采用软件进行一阶哈希计算得到一阶哈希表的索引地址,采用软件程序调用所述步骤S2)至步骤S4)中生成的一阶哈希表,如果该索引地址的表项的col为0,则表明没有冲突,直接输出该地址索引对应的表项中地址/索引中的内容,即静态键值的序号,进入步骤Q6),否则进入下一步;

Q2)软件从一阶哈希表中提取一个基地址、一个CRC size与函数池索引中存放的哈希函数的地址索引值;

Q3)软件从哈希函数的地址索引值中读取真随机数与要查找的静态键值作有限域就计算,得到一个偏移地址有限域计算结果,再将此结果与CRC size决定的CRC本原多项式做CRC运算,得到一个偏移地址;

Q4)软件将偏移地址与基地址的和作为二阶哈希表的地址索引值;

Q5)采用软件程序调用二阶哈希表,根据Q4)中计算的地址索引值,从二阶哈希表中读取出一个序号;

Q6)采用软件根据上一步得到的序号从原始键值表中读取原始键值与哈希索引值,并将原始键值与查询的键值做比较,如果相同,则输出哈希索引值作为查询键值的索引值,如果不相同,则显示查询失败。

将哈希训练模块生成的一阶哈希表,函数池和二阶哈希表复制保存,在查询电路中直接通过软件程序调用,如果发现一阶哈希表项没有冲突指示,可以在一阶哈希表中读取静态键值的序号,如果在一阶哈希表中发现了冲突指示则读取一阶哈希表中地址/索引,函数池索引与CRC size,经过二阶哈希计算,得到静态键值在二阶哈希表存放位置的地址索引值,再在二阶哈希表该地址索引值的表项读出静态键值的序号。最后通过序号可以查询出原始的键值与对应的哈希索引号,如果查询的键值与查询的键值相等,则表明此查询是一个基于此大规模静态键值表的查询,输出哈希索引号。

本发明与现有技术相比,具有以下优点及有益效果:

(1)本发明基于给定的静态键值表,生成一个静态键值表的完美哈希结构,使得对于任意给定的键值,通过最多三次查表,查询到一个由用户预先指定的索引号。通过概率估算以及仿真,初始的时候将冲突组的映射空间的大小设置为大于或等于冲突数的最小的2的整数次幂,如果多次尝试仍然不能找到一个合适的映射,可以将映射空间放宽一倍,即CRC本原多项式的长度增加1。通过不断尝试可以找到一个合适的哈希函数,使得一阶哈希下的冲突在同一槽位的键值之间在二阶哈希下互不冲突,这就解决了哈希冲突的问题,同时大大的节约二阶哈希表的容量。

(2)本发明将静态键值转换到有限域中,这样实数域中的算术运算由有限域中的加法与乘法运算和一个变长的CRC运算代替。有限域和CRC的计算容易通过集成电路实现,并且经过流水线设计电路能运行到很高的频率,最快能使每一个时钟周期输出一个哈希计算结果。

附图说明

图1为本发明的系统原理框图;

图2为哈希训练模块的原理图;

图3为二阶哈希表的序号写入的原理图;

图4为流水线查询电路的原理图;

图5为非流水线查询电路的原理图;

图6为有限域计算模块中的一阶哈希计算原理图;

图7为有限域计算模块中的二阶哈希计算原理图。

具体实施方式

哈希算法:hash算法,也叫哈兮算法,哈希算法将任意长度的二进制键值映射为范围较小的整数集合,这个映射的结果被称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式,如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。数据的哈希值通常用来检验数据的完整性。一般用于快速查找和加密算法;

CRC:循环冗余码校验。

最大冲突数:设定电路时候预先确定的一个参数,这个参数需要根据原始键值的数量以及一阶哈希表的深度来确定。

下面结合实施例对本发明作进一步地详细说明,但本发明的实施方式不限于此。

实施例1:

结合附图1-3所示,一种基于完美哈希算法的FPGA训练及查询电路实现方法,包括以下步骤:

S1)将静态键值和静态键值的哈希索引值输入静态键值表;

S2)将静态键值与输入的一个真随机数作一阶哈希计算得到一阶哈希表,所述一阶哈希表的表项包括:

地址/索引:在对静态键值重新排列阶段,表示静态键值在生成的键值重排表的基地址;在二阶哈希训练完成后即一阶哈希表中的冲突组解决后,如果vld=1,col=0,表示静态键值的序号;如果vld=1,col=1,表示静态键值的序号存放在二阶哈希训练生成的二阶哈希表中的基地址;

vld:1比特,有效指示,vld=1时表示至少有一个键值经过一阶哈希运算映射到这个表项上;

col:1比特,当vld=1,col=1的时候表示有几个键值冲突到此表项上;当vld=1,col=0时表示只有一个键值映射到这个表项上;

col_cnt:冲突组冲突计数,每当有一个键值被映射到这个槽位,则将此计数值加1,每当有一个冲突在此槽位上的键值被复制进入键值重排表,则计数值减1;

col_rec:冲突组冲突数记录,每当有一个键值被映射到这个冲突组的槽位,则将此计数值加1;

函数池索引:如果一阶哈希表中此槽位没有冲突,则为空,如果存在冲突则存放二阶哈希训练过程中的哈希函数的索引;

CRC size:映射到这个槽位的所有键值在进行二阶哈希时,采用CRC本原多项式的长度;

S3)读取静态键值表的每一个静态键值并查找一阶哈希表,将冲突于同一槽位的静态键值复制到键值重排表,使在一阶哈希表中冲突于同一槽位的静态键值在键值重排表中的位置相邻;

S4)遍历查询一阶哈希表,根据一阶哈希表中的冲突信息将冲突到一阶哈希表中相同槽位的所有键值从键值重排表中读取出来,这些键值对应为一阶哈希表的一个冲突组,进行二阶哈希计算,使所述冲突组映射到二阶哈希表中不同的地址索引值;

S5)再次遍历原始键值表,将某一键值keyi进行一阶哈希计算,其中i为自然数,计算结果对应一阶哈希表中的一个地址,如果此地址的表项显示col=0,则查询下一个原始键值keyi+1,否则,结合一阶哈希表中的信息进行二阶哈希计算,计算结果为其在二阶哈希表中的地址,将i填入二阶哈希表的表项,然后查询下一个原始键值keyi+1

S6)查询静态键值的序号或地址索引时,在所述一阶哈希表和/或二阶哈希表,查找静态键值的序号,根据序号读取原始键值表的原始键值与哈希索引值,输入查询的键值与原始键值对比,如果相等,则输出哈希索引值;否则,查询失败。

所述步骤S2)中由静态键值表通过一阶哈希计算生成一阶哈希表的过程由一阶哈希训练模块来完成,一阶哈希训练模块由FPGA来实现。所述一阶哈希训练模块用于使静态键值表中的每一个静态键值映射到一阶哈希表的一个槽位。经过一阶哈希计算之后,映射到一阶哈希表同一槽位的静态键值组成一个冲突组,需要进行二阶哈希计算,使冲突到同一槽位的静态键值映射到二阶哈希表中不同的地址索引值,即使每个静态键值都能映射到一阶哈希表或二阶哈希表中的一个唯一无冲突的地址索引值。所述步骤S3)中的键值重排用FPGA重排控制模块实现键值重排表,用于将一阶哈希表中冲突到同一槽位的静态键值重新排列,将冲突到同一槽位的静态键值写入键值重排表相邻的位置。所述步骤S4)读取键值重排表中的静态键值,并在一阶哈希表中查找冲突组的信息,进行二阶哈希计算,找到一个使静态键值映射到二阶哈希表中地址索引互不冲突的函数,函数由一个参与有限域计算的真随机数以及一个CRC本原多项式组成。将真随机数装入哈希函数池,并将此函数与CRC本原多项式的项数的位置记入一阶哈希表;查询静态键值的序号时,可以通过查找一阶哈希表或二阶哈希表找到静态键值的序号。

实施例2:

在实施例1的基础上,结合附图1-3和图6所示,所述骤S2)具体为:

S2.1)清空一阶哈希表,使一阶哈希表初始状态全为0;

S2.2)将静态键值表中的第一个静态键值与输入的一个真随机数进行一阶哈希计算,得到一阶哈希表的地址索引值,将静态键值的序号写入一阶哈希表所述地址索引值对应的表项中的地址/索引,将所述表项的col_cnt与col_rec写入“1”,将所述表项的有效指示vld写入“1”;

S2.3)读取下一个静态键值,进行一阶哈希计算,得到静态键值对应的一阶哈希表的地址索引值,读取该地址索引值对应的表项的有效指示vld,如果有效指示vld为“1”,则将该表项的col_cnt和col_rec均加“1”,将所述表项的col置为“1”,清空地址/索引的内容;如果该表项的有效指示vld为“0”,则将该表项的col_cnt和col_rec均置为“1”,将所述表项的有效指示vld写入“1”,并且将静态键值的序号写入表项的地址/索引;判断col_cnt与col_rec的数值,如果数值大于预先设定的最大冲突数,则重新选择一阶哈希计算的参数即输入的一个真随机数,并返回S2.1);

S2.4)重复步骤S2.3),直到完成遍历静态键值表。

将静态键值映射到一阶哈希表,将在一阶哈希表中没有冲突的静态键值的序号存至一阶哈希表的地址/索引中,在一阶哈希表中采用表项的col_cnt和col_rec的值来判断静态键值映射到一阶哈希表中是否存在冲突,如果存在冲突,则需要进行二阶哈希计算。如果col_cnt和col_rec的数值大于预先设定的最大冲突数即一阶哈希计算有误,需要更改一阶哈希计算中,参与有限域的真随机数,并返回S2.1),此处所述最大冲突数为设定电路时候预先确定的一个参数,这个参数需要根据键值的数量以及一阶哈希表的深度,通过软件模拟或者经验值来设定一个合适的数值。

实施例3:

在实施例2的基础上,结合附图1-3和图6所示,所述步骤S3)具体为:

S3.1)设置FPGA内部计数器base_addr_cnt为0,读取静态键值表中的第一个静态键值,从一阶哈希表读取该静态键值对应的地址索引值的表项中的col,如果col等于0,则所述静态键值未产生冲突,直接读取下一个静态键值;否则,将一阶哈希表中该静态键值对应的表项的地址/索引写入base_addr_cnt=0作为键值重排表中的基地址,更新base_addr_cnt=base_addr_cnt+col_rec,并将0+col_cnt-1作为所述静态键值在重排表中的绝对地址,复制所述静态键值至所述绝对地址,同时将一阶哈希表中该静态键值对应的地址索引值的表项的col_cnt减1;

S3.2)从静态键值表中的第二个静态键值开始,读取第i个静态键值(i为≥2的整数),在一阶哈希表中读取第i个静态键值的地址索引值对应的表项信息,如果col等于0,则直接读取下一个键值,否则,如果:

a)col_cnti大于1且col_cnti=col_reci

a.1)将base_addr_cnt写入该表项的地址/索引,将base_addr_cnt+col_cnti-1作为所述静态键值在重排表中的绝对地址,复制此静态键值至所述绝对地址;

a.2)base_addr_cnt=base_addr_cnt+col_reci

a.3)col_cnti=col_cnti-1;

b)col_cnti大于或等于1且col_reci≠col_cnti,表明该表项的地址/索引已经被写入基地址;

b.1)从表项信息的地址/索引获取基地址base_addr_temp

b.2)将base_addr_temp+col_cnti-1作为所述静态键值在重排表中的绝对地址,复制此静态键值至所述绝对地址;

b.3)col_cnti=col_cnti-1;

S3.3)重复步骤S3.2),直到遍历所有原始键值。

将在一阶哈希表中冲突的静态键值排列在键值重排表中相邻的位置,这样二阶哈希计算模块可以从键值重排表中连续读取一个冲突组的数据。只需要读取产生冲突的静态键值,而不需要遍历静态键值表,因此大大节省了时间。

实施例4:

在实施例3的基础上,结合附图1-3、图6和图7所示,所述步骤S4)具体为:

S4.1)遍历一阶哈希表.如果当前一阶哈希表项中col=1,则根据表项信息从重排表中读取一个冲突组,将冲突的键值发送至FPGA实现的并行计算单元,所述当前工作的并行计算单元的数目与冲突组中发生冲突的键值的数目相等;

S4.2)根据所述冲突组的数目设定一个最小的L,L为CRC本原多项式的长度减1,使2L-冲突组产生冲突的键值的数目≥0;

S4.3)首先判断一阶哈希的函数池是否为空,如果为空,则直接进入S4.5)中从外部输入真随机数的尝试;否则,读取一阶哈希表的函数池索引中的真随机数;

S4.4)将真随机数与冲突组中的静态键值分别做二阶哈希计算,如果找到一个真随机数配合一个长度为L加1的CRC本原多项式计算满足一阶哈希表中冲突到同一槽位的静态键值经过二阶哈希计算映射到二阶哈希表的不同的偏移地址,即解决了这个冲突组,将所述基地址存至一阶哈希表的地址/索引中;如果此真随机数来自外部,则需先将此真随机数写入函数池,如果真随机数来自函数池,则不需要将此真随机数写入函数池,然后将真随机数在函数池的位置记录在一阶哈希表的函数池索引,将CRC的本原多项式的项数记录在一阶哈希表的CRC size;

S4.5)如果一阶哈希表中的函数池中所有的真随机数都不能解决冲突,则从外部输入真随机数尝试,重复步骤S4.4);

S4.6)如果在第S4.5)步中,尝试外部真随机数达到设定的上限,没有找到一个合适的真随机数使得冲突得以解决,则放宽CRC本原多项式的长度;

S4.7)重复步骤S4.3至步骤S4.5),直到找到一个合适的真随机数与长度为L的CRC计算方式。

根据冲突组大小K确定本原多项式,首先确定CRC本原多项式项数为:ceil(log2(K))+1,其中ceil表示向上取整,L+1是本原多项式的长度,每当CRC的项数更新或者开始一次新的冲突解决,此模块首先从哈希函数池中依次读取真随机数,将这些真随机数选择进入二阶哈希计算模块,当哈希函数池被读空,采集外部真随机数送入二阶哈希计算模块。二阶哈希计算模块中有一个真随机数位置指示(cur_hash_func_deep),当前真随机数是来自于哈希函数池时,位置指示为其在哈希函数池的位置;如果真随机数来自于外部随机源,则该位置指向函数池最后一个有效位置的下一个位置。由于并行设计,本设计中一个时钟周期检查一次。如果连续检查了多个时钟周期,达到设定的次数,都没有出现结果互异的情况,则向二阶哈希计算模块中的冲突控制模块发送信息,告知其增大CRC的项数即增加了冲突组映射的地址空间。冲突组中键值的数量将被翻译为CRC的项数。随机数与随机数的位置一起进入延迟模块,延迟模块包括本原多项式项数的延迟以及真随机数的延迟,用以将这两个信息与二阶哈希计算结果对齐。

优选地,S4.4)中将所述基地址存至一阶哈希表的地址/索引中的具体步骤为:

S4.4.1)如果当前一阶哈希表项在一阶哈希表中的位置为j,如果j=1,则首先设置二阶哈希表的基地址base_addr=0,进入S4.4.2);如果j≠1,则进入S4.4.2);

S4.4.2)将base_addr写入一阶哈希表表项的地址/索引中;

S4.4.3)base_addr=base_addr+2M,M=Lj

二阶哈希计算模块中的冲突解决模块检查二阶哈希计算的计算结果,如果这些结果互不相同,则锁存当前的本原多项式项数、锁存当前的随机数深度指示(cur_hash_func_deep)与真随机数本身,并记录本冲突组键值经过二阶哈希后在二阶哈希表中的基地址:base_addr。此基地址初始值为0。每当解决一个冲突组,base_addr=base_addr+2M,M=Lj

优选地,所述S5)步骤具体为:从地址0开始,遍历原始键值表,如果当前的地址为j,0<=j<=原始键值表的深度减一

S5.1)从原始键值表中读一个原键值keyj

S5.2)keyj进行一阶哈希计算,计算得到结果hash_1_addr;

S5.3)用hash_1_addr作为地址查询一阶哈希表;

S5.4)查看一阶哈希表项的内容,如果col=1,则进入下一步;否则,如果j没有达到最大值,j=j+1返回步骤S5.1);

S5.5)用一阶哈希表项中的函数索引查询出有限域计算的真随机数,用一阶哈希表项中的CRC size来选择CRC计算的本原多项式,用一阶哈希表项中的地址/索引项得到基地址;经过有限域与CRC计算得到地址偏移,与基地址相加得到二阶哈希计算得到结果hash_2_addr;

S5.6)将j值写入二阶哈希表中地址hash_2_addr的表项中;

S5.7)如果j没有达到最大值,j=j+1,返回步骤S5.1)。

在有限域计算模块中,将输入的键值和真随机数分割成相同数量的多个比特段,经过有限域的乘法和加法运算,将有域计算结果进一步做CRC运算,最后输出哈希计算结果,这样真随机数与CRC的计算方式就决定了输入的静态键值在二阶哈希计算中的映射关系,通过改变这个真随机数以及CRC的长度,就能得到不同的映射关系。通过概率估算以及仿真,由集成电路多次尝试,可以找到一个合适的由有限域计算的真随机数与项数较小的CRC的本原多项式两部分组成的哈希函数,使得冲突在同一槽位的静态键值在二阶哈希下互不冲突。这大大的节约二阶哈希表的容量。静态键值转换到有限域中,实数域中的算术运算由有限域中的加法与乘法运算代替,由FPGA查询电路实现有限域的计算,使每一个时钟周期输出一个哈希计算结果,计算效率提高几个数量级。

实施例5:

在实施例1的基础上,结合附图1-7所示,所述步骤S6)具体为:

S6.1)接收需要查询的键值,采用与步骤S2)中相同的静态键值和真随机数分别作一阶哈希计算得到一阶哈希表,如果该索引地址的表项的col为0,则表明没有冲突,直接输出该地址索引对应的表项中地址/索引中的内容,即静态键值的序号,进入S6.7,否则进入下一步;

S6.2)从一阶哈希表中提取一个基地址、一个CRC size与一个哈希函数池的索引;

S6.3)根据哈希函数池的索引从哈希函数池获取一个哈希函数,此哈希函数就是指有限域计算需要的训练阶段保存在函数池中的真随机数;

S6.4)将哈希函数与要查找的静态键值作有限域就计算,得到有限域计算结果,再将此结果与CRC size决定的CRC本原多项式做CRC运算,得到一个偏移地址;

S6.5)将偏移地址与基地址的和作为二阶哈希表的地址索引值;

S6.6)根据地址索引值查找二阶哈希表,找到所述二阶哈希表中存放的静态键值的序号;

S6.7)通过查询到的序号从原始静态键值表中查询出原始的键值与哈希索引值,将需要查询的键值与原始的键值做比较;如果相等,则输出哈希索引值,如果不相等,则显示查询失败。

采用FPGA查询电路查询静态键值的序号,可以采用并行计算的方法快速的查找静态键值的序号,运算速率快。

实施例6:

在实施例5的基础上,结合附图1-7所示,所述步骤S6)采用流水线查询电路或非流水线查询电路实现静态键值哈希索引值的查询,所述流水线查询电路用于查询在FPGA内部实现的表项;所述非流水线查询电路用于查询外部存储器中实现的表项。

流水线查询电路查询的表项包括一阶哈希表,二阶哈希表,哈希函数池,静态键值表,都在FPGA内部实现。非流水线查询电路比流水线查询减少了两个延迟模块,如果一阶哈希计算结果不需要进行二阶哈希计算,则直接关闭二阶哈希计算过程。在非流水查询方式下,每次查询键值的索引值,需要等到查询结果返回才开始下一次查询过程。非流水线查询电路适合外部存储器接口,从而使得对于几个表项的查询在时间上不冲突。

实施例7:

在实施例1的基础上,结合附图1-3所示,所述步骤S6)具体为

Q1)接收需要查询的静态键值,采用软件进行一阶哈希计算得到一阶哈希表的索引地址,采用软件程序调用所述步骤S2)至步骤S4)中生成的一阶哈希表,如果该索引地址的表项的col为0,则表明没有冲突,直接输出该地址索引对应的表项中地址/索引中的内容,即静态键值的序号,进入步骤Q6),否则进入下一步;

Q2)软件从一阶哈希表中提取一个基地址、一个CRC size与函数池索引中存放的哈希函数的地址索引值;

Q3)软件从哈希函数的地址索引值中读取真随机数与要查找的静态键值作有限域就计算,得到一个偏移地址有限域计算结果,再将此结果与CRC size决定的CRC本原多项式做运算,得到一个偏移地址;

Q4)软件将偏移地址与基地址的和作为二阶哈希表的地址索引值;

Q5)采用软件程序调用二阶哈希表,根据Q4)中计算的地址索引值,从二阶哈希表中读取出一个序号;

Q6)采用软件根据上一步得到的序号从原始键值表中读取原始键值与哈希索引值,并将原始键值与查询的键值做比较,如果相同,则输出哈希索引值作为查询键值的索引值,如果不相同,则显示查询失败。

将哈希训练模块生成的一阶哈希表,函数池和二阶哈希表复制保存,在查询电路中直接通过软件程序调用,如果发现一阶哈希表项没有冲突指示,可以在一阶哈希表中读取静态键值的序号,如果在一阶哈希表中发现了冲突指示则读取一阶哈希表中地址/索引,函数池索引与CRC size,经过二阶哈希计算,得到静态键值在二阶哈希表存放位置的地址索引值,再在二阶哈希表该地址索引值的表项读出静态键值的序号。最后通过序号可以查询出原始的键值与对应的哈希索引号,如果查询的键值与查询的键值相等,则表明此查询是一个基于此大规模静态键值表的查询,输出哈希索引号。

以上所述,仅是本发明的较佳实施例,并非对本发明做任何形式上的限制,凡是依据本发明的技术实质对以上实施例所作的任何简单修改、等同变化,均落入本发明的保护范围之内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号