DFA压缩方法及装置、正则表达式匹配方法及系统与流程

文档序号:11677632阅读:270来源:国知局
DFA压缩方法及装置、正则表达式匹配方法及系统与流程

本发明涉及网络安全技术领域,更具体地,涉及dfa压缩方法及装置、正则表达式匹配方法及系统。



背景技术:

基于正则表达式的模式匹配,简称正则表达式匹配,是下一代防火墙(nextgenerationfirewall,ngfw)、入侵检测/防御系统(intrusiondetectionsystems/intrusionpreventionsystem,ids/ips)、统一威胁管理(unifiedthreatmanagement,utm)等安全网关系统的关键模块,而高性能的正则表达式匹配是其核心技术。正则表达式匹配通过检查和处理tcp/ip协议应用层的网包载荷(payload)对网包(packet)进行监控或者过滤。

正则表达式匹配主要通过确定型有穷自动机(deterministicfiniteautomata,dfa)和非确定型有穷自动机(undeterministicfiniteautomata,nfa)两种数据结构来实现。其中,nfa内存占用小,但匹配速度极慢,在多核或通用处理器平台上根本不能满足实际的网络处理要求;而dfa匹配速度快,缺点是内存占用过高。复杂的正则表达式集合可能引起dfa的状态数量膨胀,导致需要巨大的储存空间。



技术实现要素:

为解决正则表达式匹配中dfa内存占用过高的问题,本发明提供了dfa压缩方法及装置、正则表达式匹配方法及系统。

根据本发明的一个方面,提供了一种dfa压缩方法,包括:

根据正则表达式集合构造dfa,所述dfa包括:字符、状态和每个状态各自对应于每个字符的转移,对应于每个字符,所述转移从当前状态指向与该字符相应的一个状态;

根据所述dfa中的相同转移对状态和转移进行标记,其中所述相同转移为指向同一状态的转移;

根据所述状态的标记和所述转移的标记对所述dfa进行压缩。

具体地,所述根据所述dfa中的相同转移对状态和转移进行标记,包括:

对于所述dfa中的每个状态,选取该状态的相同转移数目最多的转移标记为该状态的第一状态转移,并将具有相同第一状态转移的状态分组到一个第一状态集合中;

对于每个所述第一状态集合,将其中满足预设条件的一个状态标记为第一状态,并将所述第一状态再次分组到一个第二状态集合中;其中,若判断第一状态转移的数目最多的状态只有一个,所述预设条件包括:第一状态转移的数目最多,若判断第一状态转移的数目最多的状态有至少两个,则所述预设条件包括:在第一状态转移的数目最多的前提下,深度最小;

对于所述第一状态集合中剩余的每个状态,若判断该状态与所述第一状态对应同一字符有相同转移的数目大于该状态的第一状态转移的数目,则将该状态标记为第二状态;

将所述第二状态再次分组到所述第一状态所在的第二状态集合中,并将所述第二状态的指向所述第一状态的转移标记为第二状态转移;

将所述第一状态集合中没被再次分组的状态组合成一个新的第一状态集合,对所述新的第一状态集合迭代执行再次分组的步骤,直到所述第一状态集合中的每个状态都被再次分组到第二状态集合中。

具体地,所述根据所述状态的标记和所述转移的标记对所述dfa进行压缩,包括:

对于每个所述第一状态,保留该第一状态的一个第一状态转移,将该第一状态的不同于所述第一状态转移的转移标记为第三状态转移,并保留所述第三状态转移,该第一状态的其他转移不保留;

对于每个所述第二状态,保留该第二状态的一个第二状态转移,将与所述第一状态对应同一字符的转移不相同的转移标记为该第二状态的第三状态转移,并保留所述第三状态转移,该第二状态的其他转移不保留。

具体地,所述根据所述状态的标记和所述转移的标记对所述dfa进行压缩,还包括:

对于每个状态的所述第三状态转移,若对应于连续的字符存在相同的第三状态转移,则对应于该连续的字符仅保留一个第三状态转移。

根据本发明的第二方面,提供了一种基于所述dfa压缩方法的正则表达式匹配方法,包括:

读取压缩后的所述dfa的当前状态和当前输入字符;

在所述当前状态的第三状态转移中查找对应于所述当前输入字符的第三状态转移;

若判断存在对应于所述当前输入字符的第三状态转移,则根据该第三状态转移将所述当前状态转移到下一个状态;

若判断不存在对应于所述当前输入字符的第三状态转移,则通过判断当前状态为第一状态或第二状态,根据当前状态的第一状态转移或第二状态转移将当前状态转移到下一个状态。

根据本发明的第三方面,提供了一种dfa压缩装置,包括:

构造单元,用于根据正则表达式集合构造dfa,所述dfa包括:字符、状态和每个状态各自对应于每个字符的转移,对应于每个字符,所述转移从当前状态指向与该字符相应的一个状态;

标记单元,用于根据所述dfa中的相同转移对状态和转移进行标记,其中所述相同转移为指向同一状态的转移;

压缩单元,用于根据所述状态的标记和所述转移的标记对所述dfa进行压缩。

具体地,所述标记单元包括:

第一标记子单元,用于为所述dfa中的每个状态选取该状态的相同转移数目最多的转移标记为该状态的第一状态转移,并将具有相同第一状态转移的状态分组到一个第一状态集合中;

第二标记子单元,用于将每个所述第一状态集合中满足预设条件的一个状态标记为第一状态,并将所述第一状态再次分组到一个第二状态集合中;其中,若判断第一状态转移的数目最多的状态只有一个,所述预设条件包括:第一状态转移的数目最多,若判断第一状态转移的数目最多的状态有至少两个,则所述预设条件包括:在第一状态转移的数目最多的前提下,深度最小;

第三标记子单元,用于判断所述第一状态集合中剩余的每个状态,若该状态与所述第一状态对应同一字符有相同转移的数目大于该状态的第一状态转移的数目,则将该状态标记为第二状态;还用于将所述第二状态再次分组到所述第一状态所在的第二状态集合中,并将所述第二状态的指向所述第一状态的转移标记为第二状态转移;

迭代子单元,用于将所述第一状态集合中没被再次分组的状态组合成一个新的第一状态集合,并将所述新的第一状态集合发送到所述第一标记子单元和第二标记子单元以迭代执行再次分组的步骤,直到所述第一状态集合中的每个状态都被再次分组到第二状态集合中。

具体地,所述压缩单元具体用于:

对于每个所述第一状态,保留该第一状态的一个第一状态转移,将该第一状态的不同于所述第一状态转移的转移标记为第三状态转移,并保留所述第三状态转移,该第一状态的其他转移不保留;

对于每个所述第二状态,保留该第二状态的一个第二状态转移,将与所述第一状态对应同一字符的转移不相同的转移标记为该第二状态的第三状态转移,并保留所述第三状态转移,该第二状态的其他转移不保留。

具体地,所述压缩单元还具体用于:

对于每个状态的所述第三状态转移,若对应于连续的字符存在相同的第三状态转移,则对应于该连续的字符仅保留一个第三状态转移。

根据本发明的第四方面,提供了一种正则表达式匹配系统,包括所述dfa压缩装置以及读取单元、匹配单元,其中:

读取单元,用于读取压缩后的所述dfa的当前状态和当前输入字符;

匹配单元,用于在所述当前状态的第三状态转移中查找对应于所述当前输入字符的第三状态转移;

若判断存在对应于所述当前输入字符的第三状态转移,则根据该第三状态转移将所述当前状态转移到下一个状态;

若判断不存在对应于所述当前输入字符的第三状态转移,则通过判断当前状态为第一状态或第二状态,根据当前状态的第一状态转移或第二状态转移将当前状态转移到下一个状态。

本发明提供的技术方案通过对dfa中的状态和状态的转移进行标记,根据状态的标记和转移的标记对所述dfa进行压缩,在不影响查找速率的情况下能达到较高的压缩率,使dfa占用更少内存。

附图说明

图1为dfa状态转移图和状态转移表;

图2为又一dfa状态转移图和状态转移表;

图3为本发明实施例提供的dfa压缩方法流程图;

图4为本发明又一实施例提供的dfa压缩方法流程图;

图5为前端dfa压缩后的效果图;

图6为后端dfa压缩后的效果图;

图7为本发明实施例提供的dfa压缩装置结构图;

图8为本发明又一实施例提供的dfa压缩装置结构图;

图9为本发明实施例提供的正则表达式匹配系统结构图。

具体实施方式

下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。以下实施例用于说明本发明,但不用来限制本发明的范围。

dfa由不同类型的片段构造,如全部由正则表达式拆分得到的字符串片段构造的dfa、全部由锚定的字符串片段或只含单个混沌因子的锚定片段构造的dfa等。其中,混沌因子定义为符号组合“.*”、“[^□]*”、“.+”、“[^□]+”、“.{□}”或“[^□]{□}”。

对于由字符串片段构造的dfa,也称为前端dfa,片段的语法是串接。如图1所示,图1为字符串片段“fil”、“cmd”和“url”对应的dfa状态转移图和状态转移表。对于每个串接字符,dfa都会存在对应于所述串接字符的状态的前向转移,所述前向转移从深度低的状态指向深度高的状态。除了这些前向转移之外,其它的转移基本上都是指向初始状态或者初始状态的相邻状态的后向转移,所述后向转移从深度高的状态指向深度低的状态。

例如,图1所示的dfa状态转移表中,表的上方为字符,表的左侧为dfa的状态及状态对应的深度,如2/1表示状态2的深度为1,表中的数字表示每个状态对应于不同字符的转移指向的状态。所有的转移对应于字符‘f’、‘c’和‘u’都会分别指向状态1、2或3,状态1、2和3都是状态0的相邻状态。除了前向转移和指向状态0的相邻状态的转移,其他转移都指向状态0。因此,dfa状态转移表中大部分状态的转移都是相同的,所述转移集中指向状态0、1、2和3。

由锚定的字符串片段或者只含单个混沌因子的锚定片段构造的dfa,也称为后端dfa。后端dfa中片段的语法中不仅包含串接,而且包含锚定以及混沌因子。如图2所示,图2为锚定片段集合“^e=[^&]*\.exe”、“^=[^\n]{6}”、“^=[^\n]{3,5}”和“^\.com”对应的dfa状态转移图和状态转移表。其中,锚定会使得所有状态都含有指向死状态的转移,而且对于含有对应串接字符的前向转移的状态,锚定使该状态其余的转移都指向死状态。此外,混沌因子“[^□]*”会产生一个中间状态,所述中间状态及其后续状态对于字符集合“[^□]”中的字符几乎都会指向该中间状态。而对于混沌因子“[^□]{□}”,它能产生一条状态链,链中每个状态含有的对应于“[^□]”中的字符的前向转移都指向该状态在链中的相邻状态。因为混沌因子都会有一个范围很大的“[^□]”,所以状态链中各个状态内的转移对于大部分字符是相同的,而各个状态间的转移对于大部分字符是不同的,只要包含在“[^□]”中就不同。所述状态内的转移为对于每个状态,该状态的转移。所述状态间的转移为状态间对应于同一字符的转移。

例如,图2中,锚定使得dfa中的所有状态都含有指向死状态11的转移,而且对于状态10、12、14、17、20、23和28,它们对应于除串接字符以外的其他字符的转移都指向死状态11。混沌因子“[^\&]*”产生了中间状态15,使得状态15、18、21、24和26对应于除字符‘&’和‘\.’以外的其他字符的非前向转移都指向中间状态15。混沌因子“[^\n]{6}”产生了状态链13、16、19、22、25和27,使得这些状态中与字符‘\n’以外的其他字符所对应的转移都指向下一个相邻状态,即状态16、19、22、25、27和28。混沌因子“[^\n]{6}”产生的状态链中状态间的转移大部分是不同的,如状态13和16。不同混沌因子“[^\n]{6}”中的状态和“[^\&]*”的状态间的转移大部分也不同,如状态13和15,而其他情况下状态间的转移大部分是相同的,如状态11和12、状态15和18。

综上,对于前端dfa中的每个状态,存在该状态对应于每个字符指向初始状态的转移,即状态内的转移一致性,以及状态间对应于同一字符一致指向初始状态以及初始状态的相邻状态的转移,即状态间的转移一致性。而对于后端dfa,串接的字符会带来状态内和状态间一致指向死状态的转移,即状态内和状态间的转移一致性;混沌因子“[^□]*”始终会产生中间状态,并使得串接的字符带来状态内一致指向该中间状态的转移,即状态内的转移一致性,以及状态间一致指向该中间状态、该中间状态的相邻状态和死状态的转移,即状态间的转移一致性;混沌因子“[^□]{□}”始终会产生状态链,并带来状态内一致指向状态链中相邻状态的转移,即状态内的转移一致性和状态间的转移区分性。

以上由于正则表达式的拆分特性使得状态的大量相同转移都是冗余的,本发明提出了dfa压缩方法及装置、正则表达式匹配方法及系统,最大程度地去除这些冗余的转移,从而压缩了正则表达式构造的dfa。但本发明不限于用于对以上两种dfa片段进行压缩,对于其他dfa片段中由相同转移带来的冗余问题,本发明普遍适用。

下面对dfa进行介绍:

dfa实际上为自动状态机,由多个状态、转移边和每个状态的输入组成。所述状态用圆圈中的数字表示,所述转移边用箭头表示,所述状态的输入用箭头上的字符表示。dfa的特点是对于每一个状态,确定的输入一定有一个确定的输出。如图1所示的状态0下,输入f一定会转移到状态1。使用dfa进行匹配时,先指定状态集合中的某一个状态为起始状态,分析器从起始状态开始,每读入一个字符就修改一次状态,将当前状态的下一个状态重置为当前状态。分析器在读完所有字符后,会停留在一个确定的状态,如果这个状态与期望的状态一致,则所述分析器接收了所述字符串,否则所述分析器拒绝了所述字符串。

图3为本发明实施例提供的dfa压缩方法流程图,如图3所示,包括:s1,根据正则表达式集合构造dfa,所述dfa包括:字符、状态和每个状态各自对应于每个字符的转移,对应于每个字符,所述转移从当前状态指向与该字符相应的一个状态;s2,根据所述dfa中的相同转移对状态和转移进行标记,其中所述相同转移为指向同一状态的转移;s3,根据所述状态的标记和所述转移的标记对所述dfa进行压缩。

具体地,s1中的所述正则表达式一般包括表述匹配次数的量词、表述具体位置的锚点和字符串,用于表示字符串集合的规则。在进行正则表达式匹配之前需要将正则表达式转换成机器能阅读的有限自动机。dfa的状态转移表是一张二维表,如图1和图2所示,包括字符、状态和每个状态各自对应于每个字符的转移。对应于每个字符,所述转移从当前状态指向与该字符相应的一个状态。s2中所述相同转移为指向同一状态的转移,根据所述相同转移对所述dfa中状态和转移进行标记,所述标记用于区分状态和转移。s3中根据状态的标记和转移的标记对不同状态的不同转移进行不同压缩,所述压缩为去除相同转移,从而减少dfa中的数据。

例如,图1所示的dfa状态转移表包括状态1-9,字符c、d、f、i、l、m、r、u和其他字符,以及状态0-9各自对应于每个字符的转移。对应于每个字符,所述转移从当前状态指向与该字符相应的一个状态,如当前状态为0,对应于字符f,所述转移从状态0指向状态1。图1所示的dfa状态转移表中存在指向状态0、1、2和3的相同转移,根据所述相同转移对所述dfa中状态和转移进行标记。

本实施例根据dfa中的相同转移对dfa中的状态和转移进行标记,根据状态的标记和转移的标记对所述dfa进行压缩,去除了dfa中冗余的转移,使dfa占用更少内存。需要说明的是,对于其他情况下存在的由相同状态转移带来的冗余问题,本实施例也能解决,不限于本实施例所列举的情况。

图4为本发明又一实施例提供的dfa压缩方法流程图,如图4所示,在上述实施例的基础上,本实施例中所述根据所述dfa中的相同转移对状态和转移进行标记,包括:s21,对于所述dfa中的每个状态,选取该状态的相同转移数目最多的转移标记为该状态的第一状态转移,并将具有相同第一状态转移的状态分组到一个第一状态集合中;s22,对于每个所述第一状态集合,将其中满足预设条件的一个状态标记为第一状态,并将所述第一状态再次分组到一个第二状态集合中;其中,若判断第一状态转移的数目最多的状态只有一个,所述预设条件包括:第一状态转移的数目最多,若判断第一状态转移的数目最多的状态有至少两个,则所述预设条件包括:在第一状态转移的数目最多的前提下,深度最小;s23,对于所述第一状态集合中剩余的每个状态,若判断该状态与所述第一状态对应同一字符有相同转移的数目大于该状态的第一状态转移的数目,则将该状态标记为第二状态;s24,将所述第二状态再次分组到所述第一状态所在的第二状态集合中,并将所述第二状态的指向所述第一状态的转移标记为第二状态转移;s25,将所述第一状态集合中没被再次分组的状态组合成一个新的第一状态集合,对所述新的第一状态集合迭代执行再次分组的步骤,直到所述第一状态集合中的每个状态都被分组到某一个第二状态集合中。

具体地,在s21中,所述第一状态转移指一个状态转移到相同状态的转移数目最多的转移,也可以限定为一个状态转移到相同状态的转移数目大于预设阈值的转移。选取状态的第一状态转移后,判断状态的第一状态转移是否相同,将具有相同第一状态转移的状态分组到一个集合中,所述集合为第一状态集合。如果一个状态的第一状态转移与其他状态的第一状态转移都不同,则将所述状态单独分组到一个第一状态集合中。

在s22中,对于每个所述第一状态集合,其中第一状态转移数目最多的状态可能有一个或多个,若判断第一状态转移的数目最多的状态只有一个时,将该状态标记为第一状态。若判断第一状态转移的数目最多的状态有至少两个时,在第一状态转移的数目最多的状态中选择深度最小的一个状态标记为第一状态。所述深度为一个状态在状态转移图中的层次为该状态的深度,其中初始状态的层次为0层。将标记的第一状态再次单独分组到一个第二状态集合中。

在s23中,从所述第一状态集合中的剩余状态中选择第二状态并标记,所述第二状态的选择标准为与所述第一状态对应同一字符具有相同转移的数目大于各自的第一状态转移数目。从中可以看出所述第二状态与所述第一状态对应同一字符具有的相同转移中除了第一状态转移外,一定还包括其他相同转移。

在s24中,将满足所述选择标准的第二状态再次分组到所述第一状态所在的第二状态集合中。并将所述第二状态指向所述第一状态的转移标记为第二状态转移。

在s25中,一轮分组后,将所述第一状态集合中没被再次分组的状态重新组合成一个新的第一状态集合,对所述新的第一状态集合迭代再次分组的步骤,直到所述第一状态集合中的每个状态都被再次分组到某一个第二状态集合中。第二状态集合可能为一个第一状态单独组成的集合,也可能为第一状态和第二状态组成的集合。对每个状态进行两次分组是为了对状态和转移进行标记。

例如,图1中,所有状态的第一状态转移相同,将所有状态分组到一个第一状态集合中。状态0、7、8、9的第一状态转移数目最多,为6个,但状态0的深度最小,为0,所以状态0被标记为第一状态。将状态0再次分组到一个新的集合中,所述新的集合为第二状态集合。对于除状态0以外的其他每个状态,与状态0对应于同一字符具有相同转移的数目为8或9大于它们自身的核心转移数目为5或6。因此,将状态1-9标记为第二状态,并分组到状态0所在的第二状态集合中,将状态1-9指向状态0的转移标记为第二状态转移。经过一轮分组,所有的状态都被分组。

图2中,除状态15、18、21、24和26组成的第二状态集合以外。其他的每个第二状态集合仅仅包含单个状态。对于由状态10、11、12、14、17、20、23和28,它们没有被分组到一个第二状态集合中,这是因为尽管它们具有相同的第一状态转移,即指向状态11的转移,但它们与状态11对应于同一字符具有相同转移的数目。

本发明实施例对于所述dfa中的每个状态进行两次分组,根据分组结果对每个状态和每个转移进行标记,根据标记结果对dfa进行压缩,去除了dfa中大量的相同转移,使dfa占用更少的内存。

在上述实施例的基础上,本发明实施例中所述根据所述状态的标记和所述转移的标记对所述dfa进行压缩,包括:对于每个所述第一状态,保留该第一状态的一个第一状态转移,将该第一状态的不同于所述第一状态转移的转移标记为第三状态转移,并保留所述第三状态转移,该第一状态的其他转移不保留;对于每个所述第二状态,保留该第二状态的一个第二状态转移,将与所述第一状态对应同一字符的转移不相同的转移标记为该第二状态的第三状态转移,并保留所述第三状态转移,该第二状态的其他转移不保留。

具体地,一个第一状态的第一状态转移指向同一状态,对于每个所述第一状态,将该第一状态的不同于所述第一状态转移的转移标记为该第一状态的第三状态转移,保留该第一状态的一个第一状态转移和第三状态转移,该第一状态的其他转移不保留。一个第二状态的第二状态转移都指向一个第一状态。对于每个第二状态,将该第二状态与所述第一状态对应同一字符的转移不相同的转移标记为该第二状态的第三状态转移,保留该第二状态的一个第二状态转移和第三状态转移,该第二状态的其他转移不保留。不保留的转移被去除掉,减少了所述dfa的数据。所述第一状态转移、所述第二状态转移和所述第三状态转移都有一个标记。其中,所述第三状态转移中有一个ascii字符,用于匹配输入字符进行对应状态的转移。所述第一状态转移和所述第二状态转移有一个区分标记,用于区分所述第一状态转移和所述第二状态转移。

图5为前端dfa压缩后的效果图,如图5所示,第一列中没有星号的转移为所述第一状态转移,对应的状态为所述第一状态。第一列中有星号的转移为所述第二状态转移,对应的状态为所述第二状态。其它的转移为所述第三状态转移。箭头表示所述第二状态指向所述第一状态。状态0为第一状态,为状态0保留一个第一状态转移,即从状态0指向状态0的转移,以及不同于所述第一状态转移的第三状态转移,即对应字符c、f、i,从状态0分别指向状态2、1和3的转移。状态1-9为第二状态,所述第二状态的第二状态转移指向第一状态,分别为所述第二状态保留一个第二状态转移,即一个指向状态0的转移。并为所述第二状态分别保留与状态0对应同一字符的转移不相同的第三状态转移,如对于状态1,保留对应字符i指向状态4的转移。

图6为后端dfa压缩后的效果图,如图6所示,状态15、18、21、24和26组成一个第一状态集合,其他的状态各自单独组成一个第一状态集合。状态15为第一状态,为状态15保留一个第一状态转移,即从状态15转移到状态15,以及不同于所述第一状态转移的第三状态转移,即对于字符\n、\.,状态15分别转移到状态11和18。状态18、21、24和26为第二状态,所述第二状态的第二状态转移指向状态15,分别为所述第二状态保留一个第二状态转移,即一个指向状态15的转移。并为所述第二状态分别保留与状态15对应同一字符的转移不相同的第三状态转移,如对于状态18,保留对应字符e指向状态21的转移。对于其他仅由一个第一状态组成的第一状态集合,为所述第一状态保留一个第一状态转移,如从状态10指向状态11的转移,以及不同于所述第一状态转移的第三状态转移,如对应字符e从状态10指向状态12的转移

对于压缩后的dfa,每个状态的转移大大减少,前端dfa的压缩率rc为(9×10-19)/(9×10)≈79%,字符数|σ|=9。后端dfa的压缩率rc为(10×19-37)/(10×19)≈81%,字符数|σ|=10。在实际应用中,字符数|σ|=256,对于dfa的压缩率可以达到96%以上。与压缩前的dfa相比,根据公式(nfdfa+nbdfa)*|σ|*(1-rc)*(log2(nfdfa+nbdfa)+8)计算压缩前后dfa的内存占用大小。其中,nfdfa为前端dfa中的状态数,nbdfa为后端dfa中的状态数,rc为压缩率,假设nfdfa+nbdfa=65536,rc=99%,压缩前后的dfa内存占用分别为32mb和492kb,减少了几乎两个数量级的内存占用。

本实施例对所述第一状态和所述第二状态的转移进行不同方式的保留,对于所述第一状态,消除了状态内的冗余。对于所述第二状态,既消除了状态内的冗余,也消除了状态间的冗余,具有较高的压缩率。

在上述实施例的基础上,本实施例中所述根据所述状态的标记和所述转移的标记对所述dfa进行压缩,还包括:对于每个状态的所述第三状态转移,若对应于连续的字符存在相同的第三状态转移,则对应于该连续的字符仅保留一个第三状态转移。

具体地,对于每个状态的所述第三状态转移,如果对应于连续的字符存在相同的第三状态转移,则可以将相同的第三状态转移合并为一个字符范围的第三状态转移。字符是否连续可以根据字符对应的ascii码判断。

例如,一个第二状态41的第二状态转移指向状态40,第三状态转移为(a,41)、(b,41)、(c,41)、(e,42)、(f,41)和(g,41),第二状态41的第三状态转移可以进一步压缩为([a,c],41)、([e,e],42)和([f,g],41)。其中[a,c]表示字符范围,是两个8比特的值,左边值表示范围下限为a,字符a对应的ascii码数值为65。右边值表示范围上限是c,字符c对应的ascii码数值为67。在进行匹配时,按顺序比较查找,比如在状态41中查找对应字符f的转移,先比较标记转移([a,c],41)中的字符范围[a,c],判断获知f的ascii码数值比c的ascii码数值大,继续比较([e,e],42)中的字符范围[e,e],判断获知f的ascii码数值比e的ascii码数值大,继续比较([f,g],41)中的[f,g],发现f在[f,g]的端点,当前状态转移到下一个状态41。本实施例中的情况是普遍存在的,通过对每个状态的第三状态转移进行压缩,进一步提高了dfa的压缩率。

本实施例提供了一种基于所述dfa压缩方法的正则表达式匹配方法,包括:读取压缩后的所述dfa的当前状态;在所述当前状态的第三状态转移中查找对应于所述当前输入字符的第三状态转移;若判断存在对应于所述当前输入字符的第三状态转移,则根据该第三状态转移将所述当前状态转移到下一个状态;若判断不存在对应于所述当前输入字符的第三状态转移,则通过判断当前状态为第一状态或第二状态,根据当前状态的第一状态转移或第二状态转移将当前状态转移到下一个状态。

具体地,所述通过判断当前状态为第一状态或第二状态,根据当前状态的第一状态转移或第二状态转移将当前状态转移到下一个状态,包括:当所述当前状态为第一状态时,根据所述当前状态的第一状态转移,将所述当前状态转移到下一个状态;当所述当前状态为第二状态时,根据所述当前状态的第二状态转移,将所述当前状态转移到所述第二状态转移指向的所述第一状态,在所述第一状态的所述第三状态转移中查找对应于所述当前输入字符的所述第三状态转移;若存在所述当前输入字符的所述第三状态转移,则根据对应于所述当前输入字符的所述第三状态转移,将所述当前状态转移到下一个状态;若不存在所述当前输入字符的所述第三状态转移,则根据所述第二状态转移指向的所述第一状态的第一状态转移,将所述当前状态转移到下一个状态。

例如,根据图5中压缩的前端dfa对当前输入字符进行匹配,如果当前状态为0,当前输入字符为‘f’,在状态0的第三状态转移中查找输入字符‘f’的第三状态转移,判断存在对应于输入字符‘f’的第三状态转移,将当前状态0转移到状态1。如果当前状态为3,当前输入字符为‘r’,在状态3的第三状态转移中查找输入字符‘r’的第三状态转移,判断存在对应于输入字符‘r’的第三状态转移,将当前状态3转移到状态6。如果当前状态为0,当前输入字符为‘d’,在状态0的第三状态转移中查找输入字符‘d’的第三状态转移,判断存在输入字符‘d’的第三状态转移,判断状态0为第一状态,根据状态0的第一状态转移,将当前状态转移到下一个状态。如果当前状态为2,当前输入字符为‘c’,在状态2的第三状态转移中查找输入字符‘c’的第三状态转移,判断不存在输入字符‘c’的第三状态转移,判断状态2为第二状态,根据状态2的第二状态转移将状态2转移到所述第二状态转移指向的状态0,在状态0的所述第三状态转移中查找对应于字符‘c’的所述第三状态转移,判断存在对应于字符‘c’的第三状态转移,则根据该第三状态转移,将当前状态转移到状态2。如果当前状态为3,当前输入字符为‘d’。在状态3的第三状态转移中查找输入字符‘d’的第三状态转移,判断不存在输入字符‘d’的第三状态转移,判断状态3为第二状态,根据状态3的第二状态转移将状态3转移到所述第二状态转移指向的状态0,在状态0的所述第三状态转移中查找对应于字符‘d’的所述第三状态转移,判断不存在对应于字符‘d’的所述第三状态转移,则根据状态0的第一状态转移,将当前状态转移到下一个状态。

综上所述,在非压缩的dfa中,对应于当前输入字符的状态转移能够直接在当前状态找到并执行,然而对于本实施例中压缩后的dfa,根据当前状态找到对应于当前输入字符的状态转移有且只有5种可能且互斥的情况:

情形1,对于当前的第一状态,对应当前输入字符的第三状态转移被找到并执行。比如图3中当前状态为0,当前输入字符为‘f’;

情形2,对于当前的第一状态,没有对应当前输入字符的第三状态转移,即成为第一状态转移而被压缩,第一状态转移被找到并执行。比如图3中当前状态为0,当前输入字符为‘d’;

情形3,对于当前的第二状态,对应当前字符的第三状态转移被找到并执行。比如图3中当前状态为3,当前输入字符为‘r’;

情形4,对于当前的第二状态,没有对应当前输入字符的第三状态转移,即成为第一状态转移而被压缩,指向第一状态的第一状态转移首先被执行,之后转到情形1。比如图3中当前状态为2,当前输入字符为‘c’;

情形5,对于当前的第二状态,没有对应当前输入字符的第三状态转移,即成为第一状态转移而被压缩,指向第一状态的第一状态转移首先被执行,之后转到情形2。比如图3中当前状态为3,当前输入字符为‘d’。

上述情形1、2、3只需要一次状态访问,而情形4、5需要两次状态访问。因为本发明实施例中根据当前状态找到对应于当前输入字符的状态转移有且只有5种可能且互斥的情况,所以本发明实施例最坏情况下的状态访问次数为确定的2次,能够保证最坏的匹配处理性能。

本实施例提供的基于所述dfa压缩方法的正则表达式匹配方法,在使用压缩后的dfa进行匹配时不影响查找速率。

图7为本发明实施例提供的dfa压缩装置结构图,如图7所示,包括构造单元71、标记单元72和压缩单元73,其中:

构造单元71用于根据正则表达式集合构造dfa,所述dfa包括:字符、状态和每个状态各自对应于每个字符的转移,对应于每个字符,所述转移从当前状态指向与该字符相应的一个状态;标记单元72用于根据所述dfa中的相同转移对状态和转移进行标记,其中所述相同转移为指向同一状态的转移;压缩单元73用于根据所述状态的标记和所述转移的标记对所述dfa进行压缩。

具体地,所述正则表达式一般包括表述匹配次数的量词、表述具体位置的锚点和字符串,用于表示字符串集合的规则。在进行正则表达式匹配之前所述构造单元71需要将正则表达式转换成机器能阅读的有限自动机。dfa的状态转移表是一张二维表,如图1和图2所示,包括字符、状态和每个状态各自对应于每个字符的转移。对应于每个字符,所述转移从当前状态指向与该字符相应的一个状态。所述相同转移为指向同一状态的转移,所述标记单元72根据所述相同转移对所述dfa中状态和转移进行标记,所述标记用于区分状态和转移。所述压缩单元73根据状态的标记和转移的标记对不同状态的不同转移进行不同压缩,所述压缩了为去除相同转移,从而减少dfa中的数据。本实施例的举例参考方法中对应的举例,此处不再赘述。

本实施例中标记单元根据dfa中的相同转移对dfa中的状态和转移进行标记,压缩单元根据状态的标记和转移的标记对所述dfa进行压缩,去除了dfa中冗余的转移,使dfa占用更少内存。

在上述实施例的基础上,图8为本发明实施例提供的dfa压缩装置结构图,如图8所示,所述标记单元72包括所述标记单元包括第一标记子单元721、第二标记子单元722、第三标记子单元723和迭代子单元724,其中:

所述第一标记子单元721用于为所述dfa中的每个状态选取该状态的相同转移数目最多的转移标记为该状态的第一状态转移,并将具有相同第一状态转移的状态分组到一个第一状态集合中;所述第二标记子单元722用于将每个所述第一状态集合中满足预设条件的一个状态标记为第一状态,并将所述第一状态再次分组到一个第二状态集合中;其中,若判断第一状态转移的数目最多的状态只有一个,所述预设条件包括:第一状态转移的数目最多,若判断第一状态转移的数目最多的状态有至少两个,则所述预设条件包括:在第一状态转移的数目最多的前提下,深度最小;所述第三标记子单元用于723判断所述第一状态集合中剩余的每个状态,若该状态与所述第一状态对应同一字符有相同转移的数目大于该状态的第一状态转移的数目,则将该状态标记为第二状态;还用于将所述第二状态再次分组到所述第一状态所在的第二状态集合中,并将所述第二状态的指向所述第一状态的转移标记为第二状态转移;所述迭代子单元724用于将所述第一状态集合中没被再次分组的状态组合成一个新的第一状态集合,并将所述新的第一状态集合发送到所述第二标记子单元和第三标记子单元以迭代执行再次分组的步骤,直到所述第一状态集合中的每个状态都被再次分组到第二状态集合中。

具体地,所述第一状态转移指一个状态转移到相同状态的转移数目最多的转移,也可以限定为一个状态转移到相同状态的转移数目大于预设阈值的转移。所述第一标记单元721选取状态的第一状态转移后,判断状态的第一状态转移是否相同,将具有相同第一状态转移的状态分组到一个集合中,所述集合为第一状态集合。如果一个状态的第一状态转移与其他状态的第一状态转移都不同,则所述第一标记单元721将所述状态单独分组到一个第一状态集合中。

对于每个所述第一状态集合,其中第一状态转移数目最多的状态可能有一个或多个,若判断第一状态转移的数目最多的状态只有一个时,所述第二标记单元722将该状态标记为第一状态。若判断第一状态转移的数目最多的状态有至少两个时,所述第二标记单元722在第一状态转移的数目最多的状态中选择深度最小的一个状态标记为第一状态,并将标记的第一状态再次单独分组到一个第二状态集合中。

所述第三标记单元723从所述第一状态集合中的剩余状态中选择第二状态并标记,所述第二状态的选择标准为与所述第一状态对应同一字符具有相同转移的数目大于各自的第一状态转移数目。从中可以看出所述第二状态与所述第一状态对应同一字符具有的相同转移中除了第一状态转移外,一定还包括其他相同转移。

所述第三标记单元723将满足所述选择标准的第二状态再次分组到所述第一状态所在的第二状态集合中,并将所述第二状态指向所述第一状态的转移标记为第二状态转移。

一轮分组后,所述迭代单元724将所述第一状态集合中没被再次分组的状态重新组合成一个新的第一状态集合,对所述新的第一状态集合迭代再次分组的步骤,直到所述第一状态集合中的每个状态都被再次分组到某一个第二状态集合中。第二状态集合可能为一个第一状态单独组成的集合,也可能为第一状态和第二状态组成的集合。对每个状态进行两次分组是为了对状态和转移进行标记。本实施例的举例参考方法中对应的举例,此处不再赘述。

本实施例对于所述dfa中的每个状态进行两次分组,根据分组结果对每个状态和每个转移进行标记,根据标记结果对dfa进行压缩,去除了dfa中大量的相同转移,使dfa占用更少的内存。

在上述实施例的基础上,本发明实施例中压缩单元73具体用于对于每个所述第一状态,保留该第一状态的一个第一状态转移,将该第一状态的不同于所述第一状态转移的转移标记为第三状态转移,并保留所述第三状态转移,该第一状态的其他转移不保留;对于每个所述第二状态,保留该第二状态的一个第二状态转移,将与所述第一状态对应同一字符的转移不相同的转移标记为该第二状态的第三状态转移,并保留所述第三状态转移,该第二状态的其他转移不保留。

具体地,一个第一状态的第一状态转移指向同一状态,对于每个所述第一状态,压缩单元73将该第一状态的不同于所述第一状态转移的转移标记为该第一状态的第三状态转移,保留该第一状态的一个第一状态转移和第三状态转移,该第一状态的其他第一状态转移不保留。一个第二状态的第二状态转移都指向一个第一状态,对于每个第二状态,压缩单元73将该第二状态与所述第一状态对应同一字符的转移不相同的转移标记为该第二状态的第三状态转移,保留该第二状态的一个第二状态转移和第三状态转移,该第二状态的其他转移不保留。不保留的转移被去除掉,减少了所述dfa中的数据。所述第一状态转移、所述第二状态转移和所述第三状态转移都有一个标记。其中,所述第三状态转移中有一个ascii字符,用于匹配输入字符进行对应状态的转移。所述第一状态转移和所述第二状态转移有一个区分标记,用于区分所述第一状态转移和所述第二状态转移。本实施例的举例参考方法中对应的举例,此处不再赘述。

本实施例对所述第一状态和所述第二状态的转移进行不同方式的保留,对于所述第一状态,消除了状态内的冗余。对于所述第二状态,既消除了状态内的冗余,也消除了状态间的冗余,具有较高的压缩率。

在上述实施例的基础上,本实施例中的压缩单元73还具体用于对于每个状态的所述第三状态转移,若对应于连续的字符存在相同的第三状态转移,则对应于该连续的字符仅保留一个第三状态转移。

具体地,对于每个状态的所述第三状态转移,如果对应于连续的字符存在相同的第三状态转移,则压缩单元73可以将相同的第三状态转移合并为一个字符范围的第三状态转移。字符是否连续可以根据字符对应的ascii码判断。本实施例的举例参考方法中对应的举例,此处不再赘述。本实施例中的情况是普遍存在的,通过对每个状态的第三状态转移进行压缩,进一步提高了dfa的压缩率。

图9为本发明实施例提供的正则表达式匹配系统结构图,如图9所示,包括所述压缩装置以及读取单元74、匹配单元75,其中:读取单元74用于读取压缩后的所述确定有限自动机的当前状态和当前输入字符;匹配单元75用于在所述当前状态的第三状态转移中查找对应于所述当前输入字符的第三状态转移;若判断存在对应于所述当前输入字符的第三状态转移,则根据该第三状态转移将所述当前状态转移到下一个状态;若判断不存在对应于所述当前输入字符的第三状态转移,则通过判断当前状态为第一状态或第二状态,根据当前状态的第一状态转移或第二状态转移将当前状态转移到下一个状态。

具体地,所述匹配单元75具体用于当所述当前状态为第一状态时,根据所述当前状态的第一状态转移,将所述当前状态转移到下一个状态;当所述当前状态为第二状态时,根据所述当前状态的第二状态转移,将所述当前状态转移到所述第二状态转移指向的所述第一状态,在所述第一状态的所述第三状态转移中查找对应于所述当前输入字符的所述第三状态转移;若存在所述当前输入字符的所述第三状态转移,则根据对应于所述当前输入字符的所述第三状态转移,将所述当前状态转移到下一个状态;若不存在所述当前输入字符的所述第三状态转移,则根据所述第二状态转移指向的所述第一状态的第一状态转移,将所述当前状态转移到下一个状态。本实施例的举例参考方法中对应的举例,此处不再赘述。本实施例最坏情况下的状态访问次数为确定的两次,能够保证最坏的匹配处理性能。本实施例提供的正则表达式匹配系统,在使用压缩后的dfa进行匹配时不影响查找速率。

本发明提出的dfa压缩方法及装置、正则表达式匹配方法及系统,并不局限于网络安全、网络监控和网络过滤领域,凡是基于内容的网络处理服务或者涉及到利用给定特征来匹配给定内容的应用,都能使用基于本发明提出的正则表达式压缩、匹配方法进行优化处理,比如海量数据的查找和分类、web搜索、文本编辑中的查找替换等。

最后,本申请的方法仅为较佳的实施方案,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1