在前面的文章中主要介绍了hash表及其链表的结构,同时说明了如何读取表项。那表项是如何写入的了?前期的文章中有少量的提及,这里单独写一篇,介绍两种常见的方案。
CPU写入表项
当表项由CPU写入的时候,FPGA只进行读取(查表)的时候,那么表项的插入就和FPGA没有什么关系了。唯一要注意的就是表项要有一个CPU的写接口。以hash表为例,如果hash表在内部ram中,那么该ram就是CPU写,逻辑读;如果hash表在DDR中,那只需要给DDR留一个CPU的读写接口即可。
FPGA写入表项
FPGA写入表项的情况相对就要复杂一些,总体来说,不管什么场景,它都是用key计算hash值,然后查表,命中就返回命中结果,不命中就把key写入表中的过程,用一个流程图表示,如下图所示:
hash表的写入
根据前面hash表的构建,我们讨论一种情况,hash桶中存放多个key的场景,其他情况都是相似的处理方式。如下表所示:
当key6来查表时,如果计算出hash值为3,如果读取addr3,发现里面已经有key6,所以查表得到的结果是key6命中的;
当key10来查表时,如果计算出的hash值也是3,读取addr3,发现里面没有key10,返回的结果是不命中,同时还需要把key10和已经存在的其他的key一起写入addr3中,变成如下表:
hash链表的写入
hash链表的写入比hash表的写入要复杂,因为除了key的写入,还涉及到链表地址的回写。以一个具体的例子说明插入链表的过程。
假定hash桶的内容如下图所示,此时假定hash桶已经满了,但是还没有链表,hash桶中具体存放什么key,如何存放key不影响hash链表的写入,所以不在这里说明。
现在来了一个keyA,其hash值对应到上述hash桶,且没有命中,由于hash桶已经满了,无法继续写入hash桶中,必须写入链表了。因为将该keyA给到链表处理模块,链表处理模块会返回一个地址,addr1,表示当前的keyA,已经写入链表,位置在addr1,这时需要把addr1这个地址写回到hash桶中,这样链表才能建立,如下图所示,这样在查表的时候,就可以根据hash桶中的addr1,得到keyA。
同理,如果继续来一个keyB,hash值和keyA相同,在进行key比较的时候,发现hash桶中没有命中,同时链表addr1中也没有命中,即keyB没有命中,需要写入hash桶或者hash链表中。我们在查表的时候得知addr1是最后一链(NULL),因此将keyB送给链表处理模块,链表处理模块返回一个地址,假定为addr2,表示keyB已经写入addr2中,这次也需要把地址addr2写入地址addr1中,实现链表在尾部的插入。如下图所示:
当有key需要继续插入时,以此类推。
对于链表插入的位置,可以在尾部插入外,也可以在头部插入。当链表处理模块返回keyB写入的地址addr2后,将该地址写入hash桶中,同时将hash桶中的地址addr1和keyB写入到addr2中。如下图所示:
无论是从链表头插入还是链表尾插入,都不影响最终结果,可以根据自己设计,选择相对简单的实现方案。
总结
hash链表的插入,一般就是CPU写入和逻辑自己写入。逻辑写入的时候,无论hash桶或者链表每一链的结构如何,都可以采用上述的方式插入链表。
-
FPGA
+关注
关注
1630文章
21804浏览量
606505 -
cpu
+关注
关注
68文章
10918浏览量
213174 -
Hash算法
+关注
关注
0文章
43浏览量
7425 -
链表
+关注
关注
0文章
80浏览量
10612
发布评论请先 登录
相关推荐
AES中SubBytes算法在FPGA的实现
FPGA实现的FIR算法在汽车动态称重仪表中的应用
![<b class='flag-5'>FPGA</b><b class='flag-5'>实现</b>的FIR<b class='flag-5'>算法</b><b class='flag-5'>在</b>汽车动态称重仪表<b class='flag-5'>中</b>的应用](https://file1.elecfans.com//web2/M00/A4/2F/wKgZomUMMwmAUSckAAAm_6oiZs0117.jpg)
3DES算法的FPGA高速实现
![<b class='flag-5'>3</b>DES<b class='flag-5'>算法</b>的<b class='flag-5'>FPGA</b>高速<b class='flag-5'>实现</b>](https://file1.elecfans.com//web2/M00/A5/0A/wKgZomUMNq-AZ4PaAABbUoVibig168.jpg)
基于SHA-1算法的硬件设计及实现(FPGA实现)
![基于SHA-1<b class='flag-5'>算法</b>的硬件设计及<b class='flag-5'>实现</b>(<b class='flag-5'>FPGA</b><b class='flag-5'>实现</b>)](https://file.elecfans.com/web2/M00/49/3A/poYBAGKhwJCAbQ9dAAAZfjifh9E149.jpg)
从hash算法的原理和实际应用等几个角度,对hash算法进行一个讲解
![从<b class='flag-5'>hash</b><b class='flag-5'>算法</b>的原理和实际应用等几个角度,对<b class='flag-5'>hash</b><b class='flag-5'>算法</b>进行一个讲解](https://file.elecfans.com/web1/M00/BE/1C/pIYBAF7XbdqAcb0FAAAOFxFYU3E362.png)
hash算法在FPGA中的实现(4)
![<b class='flag-5'>hash</b><b class='flag-5'>算法</b><b class='flag-5'>在</b><b class='flag-5'>FPGA</b><b class='flag-5'>中</b>的<b class='flag-5'>实现</b>(4)](https://file1.elecfans.com/web2/M00/A3/72/wKgaomT5kcmAaloKAACMuciQbeY296.jpg)
评论