一种高效的静态哈希表实现方法及系统技术方案

技术编号:14424723 阅读:99 留言:0更新日期:2017-01-13 03:22
本发明专利技术涉及一种高效的静态哈希表实现方法及系统。该方法包括以下步骤:1)设定哈希桶大小hash_bit,生成多个数据对,将key[i]和value[i]对应于关键字和值;2)根据key[i]值,利用rank操作构建哈希表,并计算C表和D表;3)根据C表和D表计算rank(h),并根据rank(h)的值存储相应的key[i]和value[i];4)根据所要查询的值key判断哈希表中是否存在该元素,若存在则在对应存储位置查询并返回value值,否则访问失败;5)根据步骤4)所得的结果返回结果信息。本发明专利技术利用Rank‑select算法实现新型静态哈希表的构建与访问,可用于内容过滤、信息安全等领域。

【技术实现步骤摘要】

本专利技术旨在设计静态哈希表压缩算法,用于内容过滤、信息安全等领域。由于静态哈希表的存储占用空间较大,现今的算法对于静态哈希表的压缩还有很大优化空间。本专利技术旨在对静态哈希表进行压缩,可支持对静态哈希表的访问。
技术介绍
数据结构中的查找表分为静态查找表和动态查找表。查找表主要针对表中的数据不断地查找,直到找出其所需要的值为止。静态查找表的类型主要包括顺序查找、二分查找、分块查找及静态树表的查找等,而动态查找表的类型主要包括二叉排序树、平衡二叉树、B树和B+树等。上述介绍的查找算法查找的效率取决于比较次数,查找平均次数越多,其效率越低,平均而言查找表的查找效率并不高。为了快速定位数据,可以使用哈希表来提升访问效率。哈希表又叫做散列表,它利用键值对(key-value)来存储数据,是一种特殊的数据结构。哈希表通过把键值对映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做哈希函数,存放记录的数组叫做哈希表。哈希表中的映射不一定是单射,故可能会产生哈希冲突的现象,数据结构中有很多算法可以解决哈希冲突。哈希表的应用场景十分广泛,应用哈希表存储数据来实现快速查找是很常见的操作。在实际的计算科学中,哈希表可以在对等网络(P2P)中的路由选择、数据库查找、压缩序数索引和信息安全等方面发挥着巨大的应用。在实际生活中,哈希表也有着重要的作用。比如,银行要进行前台数据和后台数据进行对账处理时,可以根据键查找到相应的值,从而完成前后台数据的对账工作;生活中利用的IC卡乘坐公交时,将IC卡的编号作为键,上车刷卡记录为哈希表的插入过程,值中存储上车时间和站名,下车刷卡记录为哈希表的查找过程,同时删除哈希表中此编号信息并计算时间和间距。哈希表按照是否支持动态增删操作,分为静态哈希表和动态哈希表。静态哈希表是对于HASH操作只支持查询操作,不支持动态增删操作。静态哈希表适用于一次将数据预存至哈希表中,之后的工作主要负责快速查找数据。在模式串匹配算法中,静态哈希表很符合某些算法的应用背景,例如Wu-Manber、Karp-Rabin等高效算法都是利用HASH函数对规则进行处理来匹配文本,这些哈希操作往往是预先将规则一次加载至哈希表中,然后再进行匹配。现今的哈希表算法主要包括线性探测哈希算法、二分查找算法和二分哈希算法。这些算法也满足静态哈希表的需求,在存储和查询时可以有效地定位数据,但是其空间存储与查询效率方面还有很大提升空间。下面简要介绍各算法的思想。线性探测算法:当关键字key的通过哈希函数H(key)得到的哈希地址p冲突时,以p为标准,通过哈希函数H(key)另外得到新的哈希地址p1,……,如此进行迭代计算,当终于有一个哈希地址pi不出现冲突时为止,并将所对应的关键字和值存到该哈希地址上。查找时,先通过哈希函数H(key),找出哈希桶中是否存在关键字key,若存在,返回value值。二分查找算法:存储时,对关键字key值排序;查找时,利用二分算法查找key值,进而查出value。二分哈希算法:链地址分为不同的哈希桶,存储时,每个桶内利用二分查找算法存储。查找时,先通过哈希函数判断所在哈希桶,在哈希桶内利用二分查找算法查找key值,进而查出value。上述哈希表的算法在实际中均有广泛的应用,其存储和查询效率各有差异,存储所占空间和查询效率方面各有千秋。为了设计更加高效的哈希表算法,更加节省哈希表所占用的空间,本专利技术将利用rank-select算法对静态哈希表进行压缩,该算法在空间和时间方面与其他算法相比都有很大的提升。Rank-select算法是1989年文献“JacobsonG.Space-efficientstatictreesandgraphs[C]//FoundationsofComputerScience,1989.,30thAnnualSymposiumon.IEEE,1989:549-554.”中用位向量存储树结构所提出的一种压缩空间的算法。下面将详细介绍rank-select算法。Rank-select算法在文献中主要是为了压缩邻接树结构,如图1所示,将原来的基于指针存储的树结构简化为利用二进制串进行存储,其主要思想就是利用了rank-select算法。为介绍rank-select算法,首先定义参数rank(m):在二进制字符串中从第一个位置开始到位置m处1的个数。如图2中rank(10)=7。图3中,二叉树从根节点按照二叉树高度大小依次标注节点,其中黑色表示节点存在,白色表示节点为空,按照树的层级结构进行层级存储,可以看到共有8个节点为1,代表原矩阵中的8个节点信息。由图中可以看出,原二叉树结构的存储1个节点利用n个字节存储,如果按照位进行存储,其空间占用上会大大减少。在文献“V,NavarroG.Rankandselectrevisitedandextended[J].TheoreticalComputerScience,2007,387(3):332-347.”中证明对于大小为n的位向量B,仅需要o(n)的额外存储空间,即可实现O(1)时间复杂度的Rank操作。SSE指令级含有_mm_popcnt_u64等指令支持64位以上的rank位操作,在硬件上实现了rank操作,使得操作更加快捷。此外,Rank-select算法在压缩稀疏矩阵方面能取得惊人的效果。Rank-select算法能有效压缩数据,可以转化为哈希表的存储结构,为简述O(1)复杂度的rank操作,现介绍一个例子说明其算法思想。如图4所示,对于大小为n*8位的位向量B,D表和C表分别存储长度为8和32的rank操作,即存储到目前位置为止,前面1的个数。例如查询B[6]中第1个位置h的1的个数,则rank(h)=C[1]+D[1*4+2]+_mm_popcnt_u64(B[6]>>7)=6+4+1=11。其中“_mm_popcnt_u64”表示SSE4.2指令集的一条内部指令,表示当前位置到初始位置1的个数。接下来介绍O(1)时间复杂度的Rank操作具体实现过程,如图5所示。图中是例子中Rank操作的一般拓展:哈希表共存储n个key-value对,对于每个D向量,存储长度为s位,所用位数占log2r,每个C向量,存储长度为r位,所占位数是log2n,所以D向量共占比特,C向量共占比特,故额外空间共有M=nslog2r+nrlog2n---(3)]]>当计算第m个位置的rank值时,其中m=i*r+j*s+k,其中0≤k<s,可以利用以下公式进行计算:C[i]=Σk=0ir-1B[k]---(4)]]>D[i,j]=Σk=irir+js-1B[k]---(5)]]>rank(B,m)=C[i]+D[i,j]+rank(Bi*r+j*s,k)(6)其中,rank(Bi*r+j*s,k)表示从第i*j+j*s个位置到第m个位置为止,1的个数,示意图为图6。综上所述,Rank-select算法可以很好地实践在压缩邻接表结构上,能有效压缩空间。在静态哈希表中也需要进一步优化空间效率,故本专利技术旨在利用Rank-sel本文档来自技高网...
一种<a href="http://www.xjishu.com/zhuanli/55/201610793354.html" title="一种高效的静态哈希表实现方法及系统原文来自X技术">高效的静态哈希表实现方法及系统</a>

【技术保护点】
一种高效的静态哈希表实现方法,其特征在于,包括以下步骤:1)设定哈希桶大小hash_bit,生成多个数据对,将key[i]和value[i]对应于关键字和值;2)根据key[i]值,利用rank操作构建哈希表,并计算C表和D表,其中C表表示存储固定长度r的rank操作,D表表示存储固定长度s的rank操作;3)根据C表和D表计算rank(h),其中h=key mod(hash_bits),并根据rank(h)的值存储相应的key[i]和value[i];4)根据所要查询的值key判断哈希表中是否存在该元素,若存在则在对应存储位置查询并返回value值,否则访问失败;5)根据步骤4)所得的结果,返回结果信息。

【技术特征摘要】
1.一种高效的静态哈希表实现方法,其特征在于,包括以下步骤:1)设定哈希桶大小hash_bit,生成多个数据对,将key[i]和value[i]对应于关键字和值;2)根据key[i]值,利用rank操作构建哈希表,并计算C表和D表,其中C表表示存储固定长度r的rank操作,D表表示存储固定长度s的rank操作;3)根据C表和D表计算rank(h),其中h=keymod(hash_bits),并根据rank(h)的值存储相应的key[i]和value[i];4)根据所要查询的值key判断哈希表中是否存在该元素,若存在则在对应存储位置查询并返回value值,否则访问失败;5)根据步骤4)所得的结果,返回结果信息。2.如权利要求1所述的方法,其特征在于,步骤3)采用以下步骤实现基于rank操作的哈希表存储过程:3-1)将预处理的数据分为key和value数组,key[i]、value[i]与关键字、键值相对应;3-2)预先一次性导入key值至bitmap中,定义哈希桶的数量为hash_bit,按照时间度O(1)的rank操作记录key数组的数据内容;对key与hash_bit取模得到h,确保落在哈希桶内,然后将h存储在哈希桶对应位置上,按照h值的大小,记录所有key值的相应位置信息;3-3)存储计算C数组和D数组,利用rank操作从哈希表CB[0]开始记录C数组和D数组的相应信息;3-4)利用C表和D表信息,计算每个key值对应的rank值;3-5)利用rank值记录每个哈希桶内元素个数,按照哈希表C的顺序叠加记录,利用rank值作为顺序存储key、value值;3-6)存储key、value值到数组中。3.如权利要求2所述的方法,其特征在于,步骤3-2)中,hash_bit的值为CB表的大小clength和28的乘积,对每个哈希桶内分配4个大小的bitmap,每个bitmap存储64位的数据,初始化设置为各位均为0。4.如权利要求3所述的方法,其特征在于,步骤3-2)按照如下公式记录h的位置,直到所有的key值均依次记录位置:q=h&255,CB[h>>8].bitmap[q>>6]|=(1<<(q&63))。5.如权利要求2所述的方法,其特征在于,步骤3-5)中,在存储key-value对时,若不同的key有同一rank值,则首要顺序按照rank值大小顺序存储,次要顺序按照rank值相同依次存储。6.如权利要求1所述的方法,其特征在于,步骤4)采用以下步骤实现基于rank操作的哈希表访问过程:4-1)对要查询的数据key与hash_bit取模得到h;4-2)计算q=h&255,判断CB[h>>8].bitmap[q>>6]和(1<<(q&63))做与运算是否为1,即在原来哈希桶内是否有key值;若此步判断为0...

【专利技术属性】
技术研发人员:刘燕兵张春燕卢毓海谭建龙郭莉
申请(专利权)人:中国科学院信息工程研究所
类型:发明
国别省市:北京;11

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1