0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

hash算法在FPGA中的实现(2)

CHANBAEK 来源: FPGA的现今未 作者: FPGA的现今未 2023-09-07 17:02 次阅读

在前面的文章中:hash算法FPGA中的实现(一)——hash表的组建,记录了关于hash表的构建,这里记录另外一个话题,就是hash链表。我们知道,只要有hash的地方,就一定有冲突,关键就看如何解决冲突了。这里介绍两种常见的设计hash链表的方案。当然,解决hash冲突也不一定就要用链表的方法,还有其他方案。

hash链表说明

首先说下什么hash链表?还是借用上一篇文章中的图片来说明这个问题,如下图所示。hash链表是为了解决hash冲突而建立的一种数据结构。当某个key计算出hash值后,对应的hash桶中已经有了数据,出现了冲突,那这个时候就需要用一个链表来将具体相同hash值的key“链”起来,方便后续的查询。

图片

图中关于hash链表的示意,只是一种简单的表示,在FPGA的实际设计中,情况往往要复杂得多。

方案1——DDR

有的时候,我们并不知道链表到底会有多长,那么自然地会想到用DDR来存放链表。如何在DDR里组织数据结构呢?一般来讲,hash链表的数据结构如下:

图片

hash桶中除了上文所讲的数据结构外,还有一个下一链的地址addr1,它指向链表的一个节点,该链表节点的数据结构和hash桶类似,也包括key值和地址,如图中key A和addr2,对于由addr2指向的最后一链,只有key B和最后一链标记NULL。

这样的数据结构,在DDR中存放的时候,显然是不高效的。因为每处理一次hash,有多少个链表节点就要读多少次DDR。我们知道DDR的性能有2个指标,一个是Gbps,一个是Mpps。处理一次hash时读DDR的次数越多,处理的hash次数就会越少,性能就越低,所以我们优化链表的数据结构,降低对DDR的读取次数。

优化的思路和hash桶的数据结构类似,如下图所示:

图片

在一个节点中,不再只存放一个key,上图示例是存放了5个key。实际一次DDR的读写,可能最少是128byte或者256byte,以104bit的五元组为key来计算,可以存放9个key。一次可以读取N个key,相比以前的链表方案,读DDR的次数为原来的N分之一,性能提升N倍。

将这个话题继续引申下,如果hash桶存放在DDR中,那又如何构建hash表呢?如果真的需要把hash桶存放在DDR中,hash表的构建和hash链表的构建就是完全一模一样的了。

方案二——内部RAM

如果考虑所有的冲突次数在一定范围之内,那么可以把所有的链表存放在一起,即存放在一个内部的RAM中,实现对所有hash桶的链表管理。如下图所示:

图片

以4个hash桶为例子说明链表的管理,key1的hash值为0,落入到hash桶0,因此时hash桶中的指针指向地址0,即addr0,addr0为空,即可以写入key1在地址0中。同样key2的hash值也为0,由于addr0中已经有数据,此时addr1为空,因此将key2写入addr1中,同时把addr1写入key1中的下一链,完成链表的构建。

其他的key值大家可以自行推敲演练。采用这样的方案,所有的链表都存放在一个ram中,处理冲突的次数是有限的,相比DDR的方案,还是简单一些。

总结

关于上述2种方案,这里做一个简单的总结。

DDR链表内部RAM链表
应用场景万能场景,使用无限制
冲突次数无限制,只要ddr有足够空间对总体冲突次数(RAM的深度)有限制,超过后hash表无法写入,或者需要定期老化
实现难易程度相对复杂,涉及到DDR的读改写操作相对简单,但是也要实现对RAM的读改写操作,
性能低,需要串行读DDR,链表越长,性能越低高,虽然相比DDR链表性能高,同样也是链表越长,性能越低。

不管采用哪种方案,高效地组建表项,减少对hash表和链表的访问次数是hash处理性能的关键。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1629

    文章

    21729

    浏览量

    602993
  • DDR
    DDR
    +关注

    关注

    11

    文章

    712

    浏览量

    65318
  • Hash算法
    +关注

    关注

    0

    文章

    43

    浏览量

    7382
  • 链表
    +关注

    关注

    0

    文章

    80

    浏览量

    10558
收藏 人收藏

    评论

    相关推荐

    FPGA实现PID算法

    本帖最后由 发烧友LV 于 2014-12-29 20:13 编辑 FPGA实现PID算法,面临着小数的计算,请问大家一般是怎么处
    发表于 12-03 21:59

    实用AGC算法的工作原理及音频FPGA的应用

    放大调整后,确保了通信系统信号输出的幅度可基本维持恒定的状态。文中将AGC算法应用于音频信号处理,可实现FPGA,并可有效降低音频信号输
    发表于 10-21 16:42

    1HASH函数软件自保护的应用

    本文介绍了HASH 函数的原理,并重点讨论了其中的SHA-1 算法及其软件自保护的应用和实现技术。关键词:
    发表于 08-07 09:28 17次下载

    MACFPGA的高效实现

    乘累加器DSP算法中有着举足轻重的地位。现在,很多前端DSP算法都通过FPGA实现。结合FPGA
    发表于 08-06 14:41 29次下载

    AESSubBytes算法FPGA实现

    介绍了AES,SubBytes算法FPGA的具体实现.构造SubBytes的S-Box转换表可以直接查找ROM表来
    发表于 11-09 16:42 25次下载

    FPGA实现的FIR算法汽车动态称重仪表的应用

    摘 要: 本文介绍了用FPGA实现的FIR算法,并对这种算法应用于汽车动态称重仪表的结果做了分析。实践证明此
    发表于 03-11 13:46 878次阅读
    <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>的应用

    CVSD算法分析及其FPGA实现

    CVSD算法分析及其FPGA实现 概 述众多的语音编译码调制
    发表于 04-01 16:26 2473次阅读
    CVSD<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>

    FPGA实现CRC算法的程序

    Xilinx FPGA工程例子源码:FPGA实现CRC算法的程序
    发表于 06-07 15:07 28次下载

    hash表的实现原理

    软件开发,一个hash表相当于把n个key随机放入到b个bucket,以实现n个数据b个单位空间的存储。 我们发现
    发表于 09-28 14:31 0次下载
    <b class='flag-5'>hash</b>表的<b class='flag-5'>实现</b>原理

    基于SHA-1算法的硬件设计及实现FPGA实现

    算法进行深入研究,面向Xilinx K7 410T FPGA 芯片设计SHA-1算法实现结构,完成SHA-1算法编程,进行测试和后续应用。该
    发表于 10-30 16:25 4次下载
    基于SHA-1<b class='flag-5'>算法</b>的硬件设计及<b class='flag-5'>实现</b>(<b class='flag-5'>FPGA</b><b class='flag-5'>实现</b>)

    Hash算法简介

    区块Hash值时(即挖矿的过程),都使用了Hash算法,特别是SHA256算法。比特币系统本身也就是加密算法的衍生物。
    的头像 发表于 06-08 14:01 5037次阅读

    hash算法的原理和实际应用等几个角度,对hash算法进行一个讲解

    由于hash的原理是将输入空间的值映射成hash空间内,而hash值的空间远小于输入的空间。根据抽屉原理,一定会存在不同的输入被映射成相同输出的情况。那么作为一个好的hash
    的头像 发表于 06-03 17:34 3264次阅读
    从<b class='flag-5'>hash</b><b class='flag-5'>算法</b>的原理和实际应用等几个角度,对<b class='flag-5'>hash</b><b class='flag-5'>算法</b>进行一个讲解

    hash算法FPGA实现(1)

    FPGA的设计,尤其是通信领域,经常会遇到hash算法
    的头像 发表于 09-07 17:01 1204次阅读
    <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>(1)

    hash算法FPGA实现(3)

    在前面的文章主要介绍了hash表及其链表的结构,同时说明了如何读取表项。那表项是如何写入的了?前期的文章中有少量的提及,这里单独写一篇,介绍两种常见的方案。
    的头像 发表于 09-07 17:02 776次阅读
    <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>(3)

    hash算法FPGA实现(4)

    在前面的文章主要介绍了hash表及其链表的结构,以及key值的插入方法,既然有key值的插入,那就有key值的删除,一种删除是CPU通过重新刷新链表来删除,另外一种就是FPGA删除了,这里主要讨论
    的头像 发表于 09-07 17:03 729次阅读
    <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)