一种生成特征码确定状态机的方法和装置的制作方法

文档序号:7655219阅读:151来源:国知局
专利名称:一种生成特征码确定状态机的方法和装置的制作方法
技术领域
本发明涉及网络安全技术领域,特别是涉及一种生成特征码确定状态机的方法和装置。
背景技术
为了保证计算机或网络安全,通常需要检查文件或报文中是否存在妨害安全的信息,比如病毒、攻击程序等。由于这些病毒或攻击程序一般具有某种特征码,所以在检查文件或报文时,特征码就常常作为被检查的对象。如果检查出文件或报文中存在某种特征码,则可以认为该文件或报文有妨害安全的信息。
特征码一般用正则表达式(Regular Expression)的形式进行描述。由于正则表达式可以表示字符串输入状态的情况,所以通常又将正则表达式编译为确定状态机(DFA,Deterministic Finite Automation)的形式。其中,DFA中的一个状态可以表示字符串输入过程的一个状态,DFA的状态数则可以表示字符串输入过程中所存在的状态数。另外,DFA占用存储空间的大小与状态数呈正比关系,即状态数越多,DFA占用存储空间也越多。
正则表达式编译为DFA之后,就可以将文件或报文中的字符串作为输入字符串,利用DFA对输入的字符串的状态进行匹配,如果匹配成功,则确定输入字符串中存在特征码,从而实现特征码的匹配。
实际应用中,不同的病毒或攻击程序存在不同的特征码。如果为每一个特征码单独编译一个DFA,在检查某文件或报文时,由于不清楚该文件或报文是否存在妨害安全信息的特征码,也不清楚存在哪种特征码,就需要利用多个DFA依次对文件或报文进行检查,其查找速度非常缓慢。
为了提高查找特征码的速度,可以将多个特征码对应的正则表达式进行分组,并分别将每一个分组的正则表达式进行合并编译,生成对应的DFA。这样,在利用某一个DFA检查文件或报文时,就可以对多个特征码同时进行匹配,从而提高查找速度。
在生成DFA的过程中,现有技术一般是将正则表达式随机进行分组,再对每一个分组分别进行编译。在这种方式下,如果分组不合理可能会导致生成的DFA的状态数过多,占用内存过多的现象。比如,某正则表达式为/ALTER\s.* FILE\s+((AS|MEMBER|TO)\s+) (\x27[^\x27]{512})/smi;另一达式为/ALTER\s.* FILE\s+((AS|MEMBER |TO)\s+) (\x22[^\x22]{512})/smi。如果将这两个正则表达式合并编译为同一个DFA,编译后将产生3.67M个状态数,生成的DFA将占用3.67G字节的内存。但如果将两条正则表达式单独进行编译,每一条正则表达式仅生成8.6K个状态数,占用8.6M字节的内存。
可见,由于在生成DFA过程中分组不合理,多个正则表达式编译后产生的状态数可能比正则表达式单独编译后总的状态数多得多,增加了占用内存的容量,不利于实现特征码的匹配工作。

发明内容
有鉴于此,本发明的第一个发明目的在于提供一种生成特征码确定状态机的方法,可以保证分组的合理性,避免合并编译生成的确定状态机产生大量的状态,占用过多的存储空间。
本发明的第二个发明目的是提供一种生成特征码确定状态机的装置,可以保证分组的合理性,避免合并编译生成的确定状态机产生大量的状态,占用过多的存储空间。
为了达到上述第一个发明目的,本发明提出的技术方案为一种生成特征码确定状态机的方法,该方法包括以下步骤a、将第一条特征码对应的正则表达式作为当前表达式;
b、判断是否存在未与当前表达式合并编译过的未处理分组,如果有,则将未处理分组中的一个作为当前未处理分组,执行步骤c;否则,将当前表达式加入新建的分组中并单独编译生成确定状态机DFA,执行步骤d;c、将当前表达式与当前未处理分组进行合并编译,如果合并编译获得的状态数不大于当前表达式与当前未处理分组单独编译的状态数之和,则将当前表达式加入当前未处理分组中,将合并编译的结果作为生成的DFA,再执行步骤d;否则,返回步骤b;d、将下一条特征码对应的正则表达式作为当前表达式,返回步骤b,直至处理完所有特征码对应的正则表达式。
上述方案中,步骤b所述将当前表达式加入新建的分组中并单独编译生成DFA之后,步骤b进一步包括保存单独编译后获得的状态数;步骤c所述当前未处理分组单独编译的状态数为事先保存的状态数。
上述方案中,所述步骤c包括c1、将当前表达式进行单独编译,获得当前表达式单独编译的状态数;c2、将当前表达式与当前未处理分组进行合并编译,并在合并编译的过程中,实时判断当前合并编译所获得的状态数是否大于当前表达式单独编译的状态数与保存的当前未处理分组的状态数之和,如果大于,则将当前未处理分组作为已处理分组,并返回步骤b;c3、将当前表达式加入当前未处理分组中,将合并编译的结果作为生成的DFA,将合并编译后获得的状态数作为当前未处理分组的状态数进行保存,再将当前未处理分组作为已处理分组,并执行步骤d。
上述方案中,事先设置用于记录合并编译过程所产生状态数的计数变量,并将初始值设置为0,步骤c2所述将当前表达式与当前未处理分组进行合并编译的过程中进一步包括每编译完一个状态,所述计数变量加1;步骤c2所述判断当前合并编译所获得的状态数是否大于当前表达式单独编译的状态数与保存的当前未处理分组的状态数之和的方法为判断所述计数变量的值是否大于当前表达式单独编译的状态数与保存的当前未处理分组的状态数之和。
上述方案中,所述步骤d之后,如果分组个数大于事先设置的值,则该方法进一步包括x1、将所有分组中任意两个分组进行合并编译,获得任意两个分组合并编译后的状态数;x2、将最小的状态数所对应的两个分组合并为一个分组,并生成DFA;x3、判断当前分组个数是否大于事先设置的值,如果大于,则返回步骤x1;否则,退出本流程。
本发明的另一发明目的是这样实现的一种生成特征码确定状态机的装置,该装置包括表达式存储模块,用于保存特征码对应的正则表达式;表达式选取模块,用于从表达式存储模块中选取一条表达式作为当前表达式;分组存储模块,用于保存所有分组经过编译后生成的确定状态机DFA;分组选取模块,用于根据判别模块的通知从分组存储模块中选取一个未处理分组作为当前未处理分组;判别模块,用于判断分组存储模块中是否存在未与表达式选取模块中的当前表达式合并编译过的分组,如果有,则通知分组选取模块选取当前未处理分组,并通知编译模块对当前表达式与当前未处理分组进行合并编译;否则,通知编译模块对当前表达式进行单独编译;还用于根据编译模块返回的编译成功信息通知表达式选取模块选取下一条表达式,直至处理完所有特征码对应的正则表达式;编译模块,用于根据判别模块的通知,将表达式选取模块中的当前表达式和分组选取模块中的当前未处理分组进行合并编译,如果合并编译获得的状态数不大于当前表达式与当前未处理分组单独编译的状态数之和,则将当前表达式加入当前未处理分组中,将合并编译的结果作为生成的DFA保存在分组存储模块中,并向判别模块返回编译成功信息;否则,向判别模块返回编译失败信息;还用于根据判别模块的通知,对当前表达式进行单独编译,将当前表达式加入新建的分组中,将单独编译的结果作为生成的DFA保存在分组存储模块中,并向判别模块返回编译成功信息。
上述方案中,所述编译模块包括编译控制模块,用于根据判别模块发送的进行合并编译的通知,控制编译执行模块进行合并编译,在接收到来自编译执行模块的编译结束信号时向判别模块返回编译成功信息,在接收到来自状态数判别模块的超值触发信号时向判别模块返回编译失败信息;还用于根据判别模块发送的进行单独编译的通知,控制编译执行模块进行单独编译,并在接收到来自编译执行模块的编译结束信号时向判别模块返回编译成功信息;编译执行模块,用于在编译控制模块的控制下,将表达式选取模块中的当前表达式经过单独编译后获得的状态数输出给单独编译状态数存储模块保存;将表达式选取模块中的当前表达式和分组选取模块中的当前未处理分组进行合并编译,将合并编译过程中获得的状态数实时输出给状态数判别模块,并在合并编译结束时向编译控制模块返回编译结束信号,并将编译结果作为生成的DFA输出给分组存储模块保存;还用于在编译控制模块的控制下,将表达式选取模块中的当前表达式进行单独编译,并在单独编译结束时向编译控制模块返回编译结束信号,并将编译结果作为生成的DFA输出给分组存储模块;单独编译状态数存储模块,用于保存编译执行模块输出的单独编译当前表达式所获得的状态数;分组状态数存储模块,用于保存来自分组选取模块中当前未处理分组的状态数;状态数判别模块,用于实时判断来自编译执行模块的状态数是否大于单独编译状态数存储模块和分组状态数存储模块中所保存的状态数之和,如果大于,则向编译控制模块发送超值触发信号。
上述方案中,该装置进一步包括合并判别模块,用于判断分组存储模块中分组的个数是否大于事先设置的值,如果大于,则通知合并模块进行合并处理,直至分组存储模块中分组的个数小于或等于事先设置的值;合并模块,用于将分组存储模块中任意两个分组进行合并编译,将合并编译后最小的状态数所对应的两个分组合并为一个分组,并将合并分组生成的DFA保存在分组存储模块中。
综上所述,本发明提出的一种生成特征码确定状态机的方法和装置,由于在将特征码对应的正则表达式加入分组前,需要判断正则表达式和分组的合并编译产生的状态数是否大于单独编译产生的状态数,并只有在不大于的情况下,才将正则表达式加入分组生成DFA,从而保证分组的合理性,避免了合并编译后生成的DFA产生大量的状态数,占用过多的存储空间。


图1是本发明的流程图;图2是应用本发明方案的方法实施例的流程图;图3是应用本发明方案的装置实施例一的基本结构示意图;图4是装置实施例一中编译执行模块的内部结构示意图;图5是应用本发明方案的装置实施例二的基本结构示意图。
具体实施例方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图及具体实施例对本发明作进一步地详细描述。
图1是本发明生成特征码确定状态机的流程图。如图1所示,该方法可以包括步骤101将第一条特征码对应的正则表达式作为当前表达式。
步骤102~104判断是否存在未与当前表达式合并编译过的未处理分组,如果有,则将未处理分组中的一个作为当前未处理分组,执行步骤105;否则,将当前表达式加入新建的分组中并单独编译生成DFA,执行步骤108。
这里所述的单独编译和合并编译都可以采用现有的软件工具来实现,比如FLEX软件等。当然,应用本发明方案的用户还可以采用其它软件编译或自行编译,此处不再赘述。
另外,当前表达式可能需要与多个分组依次进行合并编译,才能确定应该加入哪一个分组。这里,为了区分是否进行了合并编译,可以将未与当前表达式合并编译过的分组称为未处理分组,将已经与当前表达式合并编译过的分组称为已处理分组。
步骤105将当前表达式与当前未处理分组进行合并编译。
步骤106~107判断合并编译获得的状态数是否不大于当前表达式与当前未处理分组单独编译的状态数之和,如果是,则将当前表达式加入当前未处理分组中,将合并编译的结果作为生成的DFA,再执行步骤108;否则,返回步骤102。
为了保证正则表达式分组合理,在将当前表达式加入某个分组时,需要判断加入该分组后是否发生“爆炸”,即当前表达式与要加入的分组合并编译之后的状态数是否大于单独编译的状态数之和。如果发生“爆炸”,则说明分组不合理,当前表达式不应该加入该分组中;如果没有发生“爆炸”,则说明分组是合理的,当前表达式可以加入该分组中。
实际应用中,可以在合并编译结束之后,再判断合并编译所获得的状态数是否大于单独编译的状态数之和;也可以在合并编译的过程中,实时判断合并编译所获得的状态数是否大于单独编译的状态数之和。
可以实时判断的原因在于在合并编译的过程中,每当将特征码对应正则表达式表示的一个字符串输入状态编译为DFA可以表示的一个状态后,其状态数就可以加1。所以,在编译的过程中,如果用某个变量对产生状态的数量进行计数,就可以明确当前的状态数是否大于当前表达式和当前未处理分组单独编译的状态数之和。
当然,如果在合并编译的过程中,实时判断合并编译所获得的状态数是否大于单独编译的状态数之和,还需要在判断之前明确当前表达式和当前未处理分组进行单独编译的状态数之和。
其中,确定当前表达式进行单独编译的状态数比较容易,只需要在步骤105执行合并编译之前,将当前表达式进行单独编译就可获得当前表达式的状态数。而确定当前未处理分组的状态数则需要在新建一个分组时,将加入该分组中的正则表达式进行单独编译,并将获得的状态数作为新建分组的状态数进行保存。此后,就可以直接利用保存的分组的状态数,无需再次进行编译。在进行实时判断的情况下,步骤105~步骤107又可以具体为c1、将当前表达式进行单独编译,获得当前表达式单独编译的状态数。
c2、将当前表达式与当前未处理分组进行合并编译,并在合并编译的过程中,实时判断当前合并编译所获得的状态数是否大于当前表达式单独编译的状态数与保存的当前未处理分组的状态数之和,如果大于,则将当前未处理分组作为已处理分组,并返回步骤102;c3、将当前表达式加入当前未处理分组中,将合并编译的结果作为生成的DFA,将合并编译后获得的状态数作为当前未处理分组的状态数进行保存,再将当前未处理分组作为已处理分组,执行步骤108。
步骤108将下一条特征码对应的正则表达式作为当前表达式,返回步骤102,直至处理完所有特征码的正则表达式。
这样,就可以将所有特征码的正则表达式合理地进行分组,以保证每一个分组产生的DFA不会又过多的状态,也就不会占用过多的存储空间。
为了更好地说明本发明方案,下面用一个较佳实施例进行详细描述。
本实施例中,为了区分是否与当前正则表达式进行过合并编译,可以为每一个分组依次编号,当前未处理分组的组号用current_group表示,分组总个数用group_number表示,group_number的初始值为0。
图2是本实施例的流程图。如图2所示,本实施例可以包括步骤201将第一条特征码对应的正则表达式作为当前表达式。
步骤202将current_group的值设置为0。
步骤203将当前表达式进行单独编译,获得单独编译的状态数。
步骤204判断current_group的值是否小于group_number的值,如果是,则执行步骤205;否则,执行步骤210。
这里,如果current_group的值小于group_number,则可以确定还存在未与当前表达式进行合并编译的分组。
步骤205当前表达式与current_group对应的分组进行合并编译。
步骤206~步骤207判断合并编译过程中获得的状态数是否大于当前表达式单独编译的状态数与current_group对应分组的状态数之和,如果大于,则将current_group加1,再执行步骤204;否则,执行步骤208。
这里,将current_group加1可以表示将current_group对应的分组作为已处理分组,而将下一个分组,即current_group+1对应的分组作为当前未处理分组。
步骤208判断合并编译是否结束,如果结束,则执行步骤209;否则,返回步骤205继续进行合并编译。
这里,步骤205~步骤208为一个循环过程,即当前表达式和current_group对应的分组实现合并编译的过程。但需要注意的是,这里并不是合并编译完成之后才判断合并编译过程中获得的状态数是否大于单独编译的状态数,而是在合并编译的过程中进行实时判断。
为了在合并编译过程中实时判断,可以事先设置用于记录合并编译过程所产生状态数的计数变量,并将初始值设置为0。在合并编译的过程中,如果每编译完一个状态,就将所述计数变量加1,计数变量的值就可以表示合并编译过程中所获得的状态数。那么,在步骤206进行实时判断时,就可以直接判断计数变量的值是否大于当前表达式单独编译的状态数与保存的当前未处理分组的状态数之和。
步骤209将当前表达式加入current_group对应的分组中,将合并编译的结果作为生成的DFA,并将合并编译后获得的状态数作为current_group对应分组的状态数进行保存,再执行步骤212。
步骤210新建一个分组,将当前表达式加入新建分组中单独编译生成DFA,并将单独编译后获得的状态数作为新建分组的状态数。
步骤211将group_number的值加1。
步骤212~步骤213判断是否处理完所有的特征码对应的正则表达式,如果是,则退出本流程;否则,将下一条特征码对应的正则表达式作为当前表达式,并执行步骤202。
另外,实际应用中,不管采用哪种方法生成特征码的DFA,如果分组太多都可能会导致在文件或报文中查找特征码的效率降低。在这种情况下,可以事先设置分组个数的最大值,如果实际分组个数大于这个预先设置的值,就可以进一步将分组进行合并。具体实现方式可以为x1、将所有分组中任意两个分组进行合并编译,获得任意两个分组合并编译后的状态数。
x2、将最小的状态数所对应的两个分组合并为一个分组,并生成DFA。
这里所述的将两个分组合并为一个分组就是指将两个分组中所有的正则表达式进行合并编译。
x3、判断当前分组个数是否大于事先设置的值,如果大于,则返回步骤x1;否则,退出本流程。
也就是说,通过合并分组,可以将分组的个数按照实际情况控制在一定范围内。这样,既可以保持分组的合理性,不占用过多的存储空间,又可以避免分组过多而导致查找效率降低的问题。
针对上述方法,本发明还提出一种生成特征码确定状态机(DFA)的装置实施例。图3是本发明中生成特征码DFA装置实施例一的基本结构示意图。如图3所示,该装置包括表达式存储模块301、表达式选取模块302、分组存储模块303、分组选取模块304、判别模块305、编译模块306。其中,表达式存储模块301,用于保存特征码对应的正则表达式。
表达式选取模块302,用于从表达式存储模块301中选取一条表达式作为当前表达式。
分组存储模块303,用于保存所有分组经过编译后生成的确定状态机DFA。
分组选取模块304,用于根据判别模块305的通知从分组存储模块303中选取一个未处理分组作为当前未处理分组。
判别模块305,用于判断分组存储模块303中是否存在未与表达式选取模块302中的当前表达式合并编译过的分组,如果有,则通知分组选取模块304选取当前未处理分组,并通知编译模块306对当前表达式与当前未处理分组进行合并编译;否则,通知编译模块306对当前表达式进行单独编译;还用于根据编译模块306返回的编译成功信息通知表达式选取模块302选取下一条表达式,直至处理完所有特征码对应的正则表达式。
编译模块306,用于根据判别模块305的通知,将表达式选取模块304中的当前表达式和分组选取模块302中的当前未处理分组进行合并编译,如果合并编译获得的状态数不大于当前表达式与当前未处理分组单独编译的状态数之和,则将当前表达式加入当前未处理分组中,将合并编译的结果作为生成的DFA保存在分组存储模块303中,并向判别模块305返回编译成功信息;否则,向判别模块305返回编译失败信息;还用于根据判别模块305的通知,对表达式选取模块304中的当前表达式进行单独编译,将当前表达式加入新建的分组中,将单独编译的结果作为生成的DFA保存在分组存储模块303中,并向判别模块305返回编译成功信息。
实际应用中,所述编译模块306的内部结构可以如图4所示,包括编译控制模块3061,用于根据判别模块305发送的进行合并编译的通知,控制编译执行模块3062进行合并编译,在接收到来自编译执行模块3062的编译结束信号时向判别模块305返回编译成功信息,在接收到来自状态数判别模块3065的超值触发信号时向判别模块305返回编译失败信息;还用于根据判别模块305发送的进行单独编译的通知,控制编译执行模块3062进行单独编译,并在接收到来自编译执行模块3062的编译结束信号时向判别模块305返回编译成功信息。
编译执行模块3062,用于在编译控制模块3061的控制下,将表达式选取模块302中的当前表达式经过单独编译后获得的状态数输出给单独编译状态数存储模块3064保存;将表达式选取模块302中的当前表达式和分组选取模块304中的当前未处理分组进行合并编译,将合并编译过程中获得的状态数实时输出给状态数判别模块3065,并在合并编译结束时向编译控制模块3061返回编译结束信号,并将编译结果作为生成的DFA输出给分组存储模块303保存;还用于在编译控制模块3061的控制下,将表达式选取模块302中的当前表达式进行单独编译,并在单独编译结束时向编译控制模块3061返回编译结束信号,并将编译结果作为生成的DFA输出给分组存储模块303进行保存。
分组状态数存储模块3063,用于保存来自分组选取模块304中当前未处理分组的状态数。
单独编译状态数存储模块3064,用于保存编译执行模块3062输出的单独编译当前表达式所获得的状态数。
状态数判别模块3065,用于实时判断来自编译执行模块3062的状态数是否大于单独编译状态数存储模块3064和分组状态数存储模块3063中所保存的状态数之和,如果大于,则向编译控制模块3061发送超值触发信号。
当然,图3和图4仅仅是实现本发明方案的实施例,实际应用中,也可以利用其它的装置结构实现,此处不再赘述。
另外,实际应用中,如果分组太多都可能会导致在文件或报文中查找特征码的效率降低。在这种情况下,可以事先设置分组个数的最大值,如果实际分组个数大于这个预先设置的值,就可以进一步将分组进行合并。
图5是本发明中生成特征码DFA装置实施例二的基本结构示意图。如图5所示,该装置不仅包括表达式存储模块301、表达式选取模块302、分组存储模块303、分组选取模块304、判别模块305、编译模块306,还包括合并判别模块307、合并模块308。其中,
合并判别模块307,用于判断分组存储模块303中分组的个数是否大于事先设置的值,如果大于,则通知合并模块308进行合并处理,直至分组存储模块303中分组的个数小于或等于事先设置的值。
合并模块308,用于将分组存储模块303中任意两个分组进行合并编译,将合并编译后最小的状态数所对应的两个分组合并为一个分组,并将合并分组生成的DFA保存在分组存储模块303中。
而图5中的表达式存储模块301、表达式选取模块302、分组存储模块303、分组选取模块304、判别模块305、编译模块306的功能和结构与图3相同,此处不再详细描述。
当然,如果利用DFA实现特征码匹配的设备的查询速度很块,不需要限制分组个数,也可以省略合并判别模块307和合并模块308。
应用本发明方法实施例或/和装置实施例的方案,可以将所有特征码对应的正则表达式进行分组,并在分组的过程中完成对每一个分组的编译,从而达到生成DFA的目的。由于在分组过程中,通过判断合并编译产生的状态数是否大于单独编译的状态数,可以保证分组的合理性,避免每一个分组对应的DFA产生的状态数过多,占用大量的存储空间。另外,由于可以采用实时判断合并编译过程中所获得的状态数是否大于单独编译的状态数的方法,如果大于,则不必完成后续合并编译的过程就可以确定当前表达式不应该加入该分组,从而大大节约了编译时间,提高了编译的效率。
综上所述,以上仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
权利要求
1.一种生成特征码确定状态机的方法,其特征在于,该方法包括以下步骤a、将第一条特征码对应的正则表达式作为当前表达式;b、判断是否存在未与当前表达式合并编译过的未处理分组,如果有,则将未处理分组中的一个作为当前未处理分组,执行步骤c;否则,将当前表达式加入新建的分组中并单独编译生成确定状态机DFA,执行步骤d;c、将当前表达式与当前未处理分组进行合并编译,如果合并编译获得的状态数不大于当前表达式与当前未处理分组单独编译的状态数之和,则将当前表达式加入当前未处理分组中,将合并编译的结果作为生成的DFA,再执行步骤d;否则,返回步骤b;d、将下一条特征码对应的正则表达式作为当前表达式,返回步骤b,直至处理完所有特征码对应的正则表达式。
2.根据权利要求1所述的方法,其特征在于,步骤b所述将当前表达式加入新建的分组中并单独编译生成DFA之后,步骤b进一步包括保存单独编译后获得的状态数;步骤c所述当前未处理分组单独编译的状态数为事先保存的状态数。
3.根据权利要求2所述的方法,其特征在于,所述步骤c包括c1、将当前表达式进行单独编译,获得当前表达式单独编译的状态数;c2、将当前表达式与当前未处理分组进行合并编译,并在合并编译的过程中,实时判断当前合并编译所获得的状态数是否大于当前表达式单独编译的状态数与保存的当前未处理分组的状态数之和,如果大于,则将当前未处理分组作为已处理分组,并返回步骤b;c3、将当前表达式加入当前未处理分组中,将合并编译的结果作为生成的DFA,将合并编译后获得的状态数作为当前未处理分组的状态数进行保存,再将当前未处理分组作为已处理分组,并执行步骤d。
4.根据权利要求3所述的方法,其特征在于,事先设置用于记录合并编译过程所产生状态数的计数变量,并将初始值设置为0,步骤c2所述将当前表达式与当前未处理分组进行合并编译的过程中进一步包括每编译完一个状态,所述计数变量加1;步骤c2所述判断当前合并编译所获得的状态数是否大于当前表达式单独编译的状态数与保存的当前未处理分组的状态数之和的方法为判断所述计数变量的值是否大于当前表达式单独编译的状态数与保存的当前未处理分组的状态数之和。
5.根据权利要求1至4任一项所述的方法,其特征在于,所述步骤d之后,如果分组个数大于事先设置的值,则该方法进一步包括x1、将所有分组中任意两个分组进行合并编译,获得任意两个分组合并编译后的状态数;x2、将最小的状态数所对应的两个分组合并为一个分组,并生成DFA;x3、判断当前分组个数是否大于事先设置的值,如果大于,则返回步骤x1;否则,退出本流程。
6.一种生成特征码确定状态机的装置,其特征在于,该装置包括表达式存储模块,用于保存特征码对应的正则表达式;表达式选取模块,用于从表达式存储模块中选取一条表达式作为当前表达式;分组存储模块,用于保存所有分组经过编译后生成的确定状态机DFA;分组选取模块,用于根据判别模块的通知从分组存储模块中选取一个未处理分组作为当前未处理分组;判别模块,用于判断分组存储模块中是否存在未与表达式选取模块中的当前表达式合并编译过的分组,如果有,则通知分组选取模块选取当前未处理分组,并通知编译模块对当前表达式与当前未处理分组进行合并编译;否则,通知编译模块对当前表达式进行单独编译;还用于根据编译模块返回的编译成功信息通知表达式选取模块选取下一条表达式,直至处理完所有特征码对应的正则表达式;编译模块,用于根据判别模块的通知,将表达式选取模块中的当前表达式和分组选取模块中的当前未处理分组进行合并编译,如果合并编译获得的状态数不大于当前表达式与当前未处理分组单独编译的状态数之和,则将当前表达式加入当前未处理分组中,将合并编译的结果作为生成的DFA保存在分组存储模块中,并向判别模块返回编译成功信息;否则,向判别模块返回编译失败信息;还用于根据判别模块的通知,对当前表达式进行单独编译,将当前表达式加入新建的分组中,将单独编译的结果作为生成的DFA保存在分组存储模块中,并向判别模块返回编译成功信息。
7.根据权利要求6所述的装置,其特征在于,所述编译模块包括编译控制模块,用于根据判别模块发送的进行合并编译的通知,控制编译执行模块进行合并编译,在接收到来自编译执行模块的编译结束信号时向判别模块返回编译成功信息,在接收到来自状态数判别模块的超值触发信号时向判别模块返回编译失败信息;还用于根据判别模块发送的进行单独编译的通知,控制编译执行模块进行单独编译,并在接收到来自编译执行模块的编译结束信号时向判别模块返回编译成功信息;编译执行模块,用于在编译控制模块的控制下,将表达式选取模块中的当前表达式经过单独编译后获得的状态数输出给单独编译状态数存储模块保存;将表达式选取模块中的当前表达式和分组选取模块中的当前未处理分组进行合并编译,将合并编译过程中获得的状态数实时输出给状态数判别模块,并在合并编译结束时向编译控制模块返回编译结束信号,并将编译结果作为生成的DFA输出给分组存储模块保存;还用于在编译控制模块的控制下,将表达式选取模块中的当前表达式进行单独编译,并在单独编译结束时向编译控制模块返回编译结束信号,并将编译结果作为生成的DFA输出给分组存储模块;单独编译状态数存储模块,用于保存编译执行模块输出的单独编译当前表达式所获得的状态数;分组状态数存储模块,用于保存来自分组选取模块中当前未处理分组的状态数;状态数判别模块,用于实时判断来自编译执行模块的状态数是否大于单独编译状态数存储模块和分组状态数存储模块中所保存的状态数之和,如果大于,则向编译控制模块发送超值触发信号。
8.根据权利要求6或7所述的装置,其特征在于,该装置进一步包括合并判别模块,用于判断分组存储模块中分组的个数是否大于事先设置的值,如果大于,则通知合并模块进行合并处理,直至分组存储模块中分组的个数小于或等于事先设置的值;合并模块,用于将分组存储模块中任意两个分组进行合并编译,将合并编译后最小的状态数所对应的两个分组合并为一个分组,并将合并分组生成的DFA保存在分组存储模块中。
全文摘要
本发明提供一种生成特征码确定状态机的方法和装置,将特征码对应的正则表达式进行分组并进行合并编译,如果合并编译获得的状态数不大于单独编译的状态数之和,则将特征码对应的正则表达式加入分组,将合并编译的结果作为生成的确定状态机(DFA)。应用本发明方案,可以保证分组的合理性,避免合并编译生成的DFA产生大量的状态,占用过多的存储空间。
文档编号H04L29/06GK101079890SQ20071011829
公开日2007年11月28日 申请日期2007年7月4日 优先权日2007年7月4日
发明者常利民 申请人:杭州华三通信技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1