一种fs算法最差情况下的快速多模式匹配方法

文档序号:6510794阅读:220来源:国知局
一种fs算法最差情况下的快速多模式匹配方法
【专利摘要】本发明公开了一种FS算法最差情况下的快速多模式匹配方法。本方法为:1)将模式串集合转换成反向有限自动机,计算坏字符转移函数skip1和好后缀转移函数skip2;2)构建自动机中状态s在遇到字符c时发生失配所用词典,包括:匹配串u在其他模式串中的所有深度大于u的出现位置,后缀suffix(u)在其他模式串中的所有深度大于suffix(u)的出现位置;3)设置一倒计时值cdown;将待匹配文件与模式串集合进行匹配,当skip2跳转时,记录当前失配状态对应的词典,跳转后每匹配一个字符cdown减1;若发生skip1跳转,则cdown增加skip1的跳转值;4)当cdown为0且记录的词典不为空时,利用当前记录的词典搜索对应的子串终止状态,找到相应的跳转位置,继续匹配。
【专利说明】一种FS算法最差情况下的快速多模式匹配方法
【技术领域】
[0001]本发明涉及一种多模式匹配方法,尤其涉及一种FS算法最差情况下的快速多模式匹配方法。
【背景技术】
[0002]模式匹配算法是计算机科学领域的一类基础算法,在诸多领域都有重要的应用,例如:拼写检查、搜索引擎、计算机病毒特征码匹配、入侵检测、数据压缩以及DNA序列匹配等都离不开模式匹配算法。对入侵检测等应用而言,模式匹配算法不仅要在平均情况下有较快的检测速度,在最差情况下也要快速检测,防止被攻击者利用算法的最差性能发起对入侵检测系统的DDoS (Distributed Denial of Service)攻击。例如在入侵检测系统进行域名匹配过程中,当模式集中同时存在形如abed, com和abed.com.cn的域名记录时,如果攻击者构造形如abed.com.cn.abed.com.cn的域名查询,就会造成Fan-Su (FS)或AC-BM算法性能急剧下降。
[0003]Fan-Su(FS)算法在预处理时反向构建DFSA,并采用改进的BM算法思想增加跳跃距离,平均情况下效率比经典的Aho-Corasick(AC)算法和ACBM算法高。但是由于FS基于反向自动机从右向左匹配,因此在整个匹配过程中,会使得某些字符被多次扫描,导致最差情况下的时间复杂度为0(n*maxlen)。

【发明内容】

[0004]本发明的目的是为了提高FS算法在最差情况下的性能,减少FS算法的重复匹配次数,使其可以更安全地用于实时的域名匹配。
[0005]本发明的技术方案为:
[0006]一种FS算法最差情况下的快速多模式匹配方法,其步骤为:
[0007]I)将所选的模式串集合转换成反向有限自动机,同时根据模式串中的字符分布计算坏字符转移函数Skip1和好后缀转移函数Skip2 ;
[0008]2)构建该反向有限自动机中的状态s在遇到字符c时发生失配所用的词典diet (s,c),该词典diet (s,c)包括:已匹配串u在所述模式串集合其他模式串中的所有深度大于U的出现位置,以及已匹配串U的后缀SUffiX(U)在其他模式串中的所有深度大于SUffix(U)的出现位置;其中,c e Σ, Σ是所述模式串集中的所有字符的集合;
[0009]3)设置一个倒计时值cdown=skip2 (s, c)-depth (S);将输入的待匹配文件与所述模式串集合进行匹配,当发生失配使用Skip2跳转时,记录当前失配状态对应的词典diet,跳转后每匹配一个字符cdown减I ;若发生Skip1跳转,则cdown增加Skip1的跳转值;其中,Skip2 (s,c)表示在状态s处遇到失配字符c后,利用Skip2函数计算得到的跳转长度,depth (S)表示s在反向有限自动机中的深度;
[0010]4)当cdown为O且记录的词典不为空时,利用当前记录的词典diet来搜索到对应的子串终止状态,找到相应的跳转位置,然后匹配跳转到该位置,继续匹配。[0011]进一步的,利用结构体Dict_Node记录所述词典diet (s, c)中每一元素的信息,包括:记忆子串的起始状态srestate、记忆子串的终止状态deststate、记忆子串的宽度length,以及记忆子串中的输出信息missed_output。
[0012]进一步的,利用状态s的失效转移函数f (X)计算u在所述模式串集合其他模式串中的所有深度大于U的出现位置:对于所述反向有限自动机中的任一状态X,如果f (X)=S,则将状态X对应的串的位置加入到词典diet (S,C)中。
[0013]进一步的,当转向函数goto (s, c)=0时,构建所述词典diet (s, c);如果满足goto (x, c)古 0 并且 depth (X) =skip2 (s, c) -depth (s),贝丨J 创建的结构体 Dict_Node 满
(length = depfh(x)+i
dex1.siate = goio(x.c),否则,创建的结构体Dict_Node满足公式
srcslale = getAnces lor (x, depth(s))
{length = depth(s)
j deststate = x;其中,depth (x)表示x在反向有限自动机中的深度;
[srestate = getAncestor(x, depth(s))
getAncestor (x, depth (s))为在状态x处沿着反向有限自动机向上找到第depth (s)个祖先状态,并且在寻找过程中记录经过的有输出的状态。
[0014]进一步的,对于词典diet (s,c)归并,得到已匹配串u的后缀suffix (U)在其他模式串中的所有深度大于SUffix(`U)的出现位置:对反向有限自动机进行宽度优先遍历,对于状态8及其父节点状态口,如果(1;[01:(8,0)=(1;[01:(8,0) U diet (P),则归并时,如果出现两词典的相应结构体Dict_Node的srestate相同,则取length较大者结构体Dict_Node作为归并后节点的Dict_Node ;其中,dict(p)为不考虑失配字符构造的词典。
[0015]进一步的,设置一深度阈值cbpthT,如果状态s的状态深度小于该深度阈值,则对该状态s不予构造词典。
[0016]在单模匹配算法Turbo-BM对BM算法的最差时间复杂度改进中利用了跳过记忆子串的策略,本发明就是在FS算法中也借用了这一思想,针对每一个自动机的状态都建立一个词典,借助词典完成记忆子串的跳跃,减少FS算法中重复匹配次数,改进后的算法称为S_FS算法,算法流程如图1所不。
[0017]1、FS算法基础
[0018]FS算法将模式串集合转换成反向有限自动机,得到转向函数goto和输出函数output函数,同时根据模式串中的字符分布来计算Skip1函数(坏字符转移函数)和Skip2函数(好后缀转移函数)。当匹配第一个字符时发生失配,此时移动距离值利用Skip1进行计算;当失配时已匹配字符数不为0时,则利用Skip2计算。FS使用的是改进后的好后缀和坏字符规则:计算Skip2函数值时将文本中导致失配的字符也考虑在内,坏字符仅指在窗口内第一次比较就发生失配时文本中的字符。
[0019]2、S_FS算法改进思想
[0020]文中所指的记忆子串也包括导致失配的字符。
[0021]当待匹配文本和模式集合匹配过程中发生失配采用Skip2跳转(即已经存在部分匹配的好后缀)时,记已经匹配的串为u,此时有限自动机的状态对应的词典记录u记忆子串位置的集合,词典中的位置信息包括两部分,一部分是U在其他模式串中的所有深度大于U的出现位置,另一部分是U的后缀SUffiX(U)在其他模式串中的所有深度大于suffix(u)的出现位置;当然还包括子串的长度信息length。因此当u在模式集合中存在相同子串u'时,可以利用词典中的元素跳过u'的比较,当u不存在完全相同的子串时,也可以利用词典中的元素来避免u后缀的重复比较。
[0022]在多模匹配过程中,发生失配采用Skip2进行跳转时,使用记忆词典来存储失配状态的位置信息,使得在后续的比较中利用该词典尽可能多地跳过重复的比较。记忆词典中存储了所有元素串的位置信息,包括起始状态、终止状态和子串长度,为了避免在状态的多步跳转中遗漏输出,还需要记录串跳过的所有输出节点。由于导致失配的字符c也参与FS算法的失配跳转计算,因此,导致失配的字符也可以加入到记忆子串中,从而避免该字符的重复比较。
[0023]3、S_FS算法预处理
[0024]S_FS算法首先构造反向有限自动机并沿用了原有的Skip1和Skip2函数的计算,添加了记忆词典的构造预处理。定义结构体Dict_Node,该结构体对应词典中的每一个元素。记反向有限自动机中的状态s在遇到字符c,c e Σ(Σ是模式集中的所有字符的集合)时发生失配所用的词典为diet (s, c)。Dict_Node定义包括srcstate, deststate和length,以及missed_output (srcstate和deststate分别指记忆子串的起始状态和终止状态,length是记忆子串的宽度,missed_output数组保存记忆子串中的输出信息)。
[0025]对状态s构造记忆词典diet (s, c)的过程分为两步。首先计算词典diet (s, c)的第一部分。由于Skip2的计算过程中已经得到了所有状态的失效转移函数f,因此可以利用f函数来计算。对状态s,若/(JC) = A (S,X均是状态),则可将状态X对应的串的位置加入到dict(s, c)中。对于满足goto(s, c) ^ O的情况,由于状态s在遇到字符c时不会触发记录词典的操作,因此可以不计算。仅考虑goto (s,c)=0,此时分为2种情况:
[0026]A)满足 goto(x,c) ^ O an`d depth (x) =skip2 (s, c)-depth (s),则记忆子串包括字符c,此时创建的Dict_Node满足以下公式,并加入状态s的词典中。
\ length = depth(s) +1
[0027]\ Jeststctie = goio(x.c)(5)
[srcstate = gel A ncesior (.r.Jepsh(.v))
[0028]B)否则,此时创建的Dict_Node满足以下公式,并加入状态s的词典中。
f length = depth(s)
[0029]\ ilcsfsfafc = J(6)
[srcsiaie = get Ancestor (x.depth(s))
[0030]注:
[0031]1.depth (x)表示X在自动机中的深度。
[0032]2.Skip2 (s,c)表示在状态s处遇到失配字符c后,利用skip2函数计算得到的跳转长度。
[0033]3.getAncestor (state s, size_t d)函数功能:在状态s处沿着自动机向上找到第d个祖先状态,并且在寻找过程中记录经过的有输出的状态。[0034]对满足3x./<x) = ,v的情况计算完毕后,然后进行词典归并操作。归并操作将已匹配串后缀的所有记忆子串都加入到词典中。
[0035]归并时,对反向有限自动机进行宽度优先遍历,对于状态s和其父节点状态p,diet (s, c)=dict(s, c) U diet (p),定义diet (p)为不考虑失配字符构造的词典。则归并时,如果遇到srestate相同的两个Dict_Node,取length较大者作为最终归并后节点的Dict_Node。归并操作完成了词典diet (s, c)的第二部分的计算。
[0036]这样就完成了词典的构造过程。算法可以借助词典完成多步跳转,但并非所有情况下使用词典都能达到加速匹配的效果,当使用记忆词典的代价大于重复比较的代价时,对该状态不预计算词典。因此定义状态的深度阈值depthT,在构造词典时,对于深度(状态的深度本身在建立后缀树的时候就是存储在每个状态节点里面,是后缀树里面的每个状态节点到根节点的深度)小于阈值的状态不予构造词典,从而使得程序的性能能够得到最大程度的提升。
[0037]4、S_FS匹配过程
[0038]改进的算法是在FS匹配基础上增加了记录词典、搜索词典、利用词典进行状态转移这三个部分。
[0039]在匹配过程中,当发生失配使用Skip2跳转时,记录当前失配状态s对应的词典diet (记录词典的入口位置,即记录词典),并设置一个倒计时值cdown,其中cdown=skip2(s, c)-depth(s),跳转后每匹配一个字符cdown减I,若发生Skip1跳转,贝丨Jcdown增加Skip1的跳转值。当cdown为0且记录的词典不为空时,意味着匹配到达记忆子串的开始状态位置,此时就可以利用当前记录的词典diet来搜索到对应的子串终止状态(即搜索词典的部分),找到相应的跳转值(即Dict_N0de中存储的length)然后实现状态的多步转移,继续匹配,从而达到跳过记忆子串的目的。如果跳转后的位置正好是某个模式串的末尾,那就是发生了匹配,然后就会输出匹配的串。
[0040]与现有技术相比,本发明的优点:
[0041]图2为一般情况下算法查找时间对比图,通过实验数据的分析,对比于现有的FS算法,本发明的方案拥有的优势是:充分利用了上一次匹配过程的匹配信息,减少了下一轮匹配过程中的字符串比较次数,尤其是在FS算法的最差情况下,能够提高算法的运行效率,算法效率接近AC算法性能,平均情况下S_FS算法性能也优于ACBM和AC算法。
【专利附图】

【附图说明】
[0042]图1为本发明的匹配方法流程图;
[0043]图2为一般情况下算法查找时间对比图;其中,待匹配文本:ReuterS-21578新闻文本,大小约27328KB,模式串集合:文本中长度在6以上的的高频词,模式串数目从10开始到150以20为单位递增,S_FS算法的深度阈值cbpthT取值为3 ;
[0044]图3为goto函数转移图。
【具体实施方式】
[0045]S_FS算法运行举例说明:假设待匹配的文本T是abed.com.cn.abed.com.cn.abed,com.cn.,模式串集合P= {abed.com.cn.,abed.com.},minlen=8。转移函数如图3所不。[0046]若使用FS算法进行比较,则比较结果见下表1,竖线表示匹配窗口开始位置,下划线部分表示重复比较部分,加粗表示导致失配的字符。
[0047]表1、FS算法匹配过程
[0048]
【权利要求】
1.一种FS算法最差情况下的快速多模式匹配方法,其步骤为: .1)将所选的模式串集合转换成反向有限自动机,同时根据模式串中的字符分布计算坏字符转移函数Skip1和好后缀转移函数Skip2 ; .2)构建该反向有限自动机中的状态s在遇到字符c时发生失配所用的词典diet(s,c),该词典diet (s,c)包括:已匹配串u在所述模式串集合其他模式串中的所有深度大于u的出现位置,以及已匹配串U的后缀SUffiX(U)在其他模式串中的所有深度大于SUffiX(U)的出现位置;其中,c G 2, I:是所述模式串集中的所有字符的集合; .3)设置一个倒计时值cdown=skip2(s,c)-depth(S);将输入的待匹配文件与所述模式串集合进行匹配,当发生失配使用Skip2跳转时,记录当前失配状态对应的词典diet,跳转后每匹配一个字符cdown减I ;若发生Skip1跳转,则cdown增加Skip1的跳转值;其中,Skip2 (s,c)表示在状态s处遇到失配字符c后,利用Skip2函数计算得到的跳转长度,depth (S)表示s在反向有限自动机中的深度;. 4)当cdown为0且记录的词典不为空时,利用当前记录的词典diet来搜索到对应的子串终止状态,找到相应的跳转位置,然后匹配跳转到该位置,继续匹配。
2.如权利要求1所述的方法,其特征在于利用结构体Dict_Node记录所述词典diet (s, c)中每一元素的信息,包括:记忆子串的起始状态srestate、记忆子串的终止状态deststate、记忆子串的宽度length,以及记忆子串中的输出信息missed_output。
3.如权利要求1或2所述的方法,其特征在于利用状态s的失效转移函数f(x)计算U在所述模式串集合其他模式串中的所有深度大于U的出现位置:对于所述反向有限自动机中的任一状态X,如果f &)=8,则将状态1对应的串的位置加入到词典(^(^(8,(3)中。
4.如权利要求3所述的方法,其特征在于当转向函数goto(S,c)=0时,构建所述词典diet (s, c);如果满足 goto (X,c) ^ 0 并且 depth (x) =skip2 (s, c) -depth (s),则创建的结构

体 D i c t_No de 满足公式
5.如权利要求4所述的方法,其特征在于对于词典dict(S,c)归并,得到已匹配串U的后缀SUffiX(U)在其他模式串中的所有深度大于SUffiX(U)的出现位置:对反向有限自动机进行宽度优先遍历,对于状态S及其父节点状态P,如果dict(s, c)=dict(s, c) U diet (p),则归并时,如果出现两词典的相应结构体Dict_Node的srestate相同,贝U取length较大者结构体Dict_Node作为归并后节点的Dict_Node ;其中,diet (p)为不考虑失配字符构造的词典。
6.如权利要求1所述的方法,其特征在于设置一深度阈值cbpthT,如果状态s的状态深度小于该深度阈值,则对该状态s不予构造词典。
【文档编号】G06F17/30GK103500178SQ201310406833
【公开日】2014年1月8日 申请日期:2013年9月9日 优先权日:2013年9月9日
【发明者】胡新静, 许家铭, 李晓东, 金键 申请人:中国科学院计算机网络信息中心
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1