CN111078963A - Nfa到dfa的转换方法及装置 - Google Patents
Nfa到dfa的转换方法及装置 Download PDFInfo
- Publication number
- CN111078963A CN111078963A CN201911415263.8A CN201911415263A CN111078963A CN 111078963 A CN111078963 A CN 111078963A CN 201911415263 A CN201911415263 A CN 201911415263A CN 111078963 A CN111078963 A CN 111078963A
- Authority
- CN
- China
- Prior art keywords
- nfa
- dfa
- jump
- state
- character
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
- 238000000034 method Methods 0.000 title claims abstract description 75
- 238000006243 chemical reaction Methods 0.000 title claims abstract description 42
- 238000012545 processing Methods 0.000 claims abstract description 32
- 230000009191 jumping Effects 0.000 claims description 63
- 238000004590 computer program Methods 0.000 claims description 16
- 238000010276 construction Methods 0.000 claims description 15
- 230000007704 transition Effects 0.000 claims description 3
- 230000008901 benefit Effects 0.000 abstract description 7
- 230000008569 process Effects 0.000 description 13
- 238000010586 diagram Methods 0.000 description 6
- 238000004891 communication Methods 0.000 description 5
- 230000006870 function Effects 0.000 description 4
- 238000003672 processing method Methods 0.000 description 4
- 241000700605 Viruses Species 0.000 description 3
- 230000009471 action Effects 0.000 description 3
- 238000001514 detection method Methods 0.000 description 3
- 238000004880 explosion Methods 0.000 description 3
- 238000005457 optimization Methods 0.000 description 3
- 239000000463 material Substances 0.000 description 2
- 230000003287 optical effect Effects 0.000 description 2
- 101100394003 Butyrivibrio fibrisolvens end1 gene Proteins 0.000 description 1
- 230000006399 behavior Effects 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- ZPUCINDJVBIVPJ-LJISPDSOSA-N cocaine Chemical compound O([C@H]1C[C@@H]2CC[C@@H](N2C)[C@H]1C(=O)OC)C(=O)C1=CC=CC=C1 ZPUCINDJVBIVPJ-LJISPDSOSA-N 0.000 description 1
- 230000007123 defense Effects 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 238000003780 insertion Methods 0.000 description 1
- 230000037431 insertion Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000002265 prevention Effects 0.000 description 1
- 230000000717 retained effect Effects 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/903—Querying
- G06F16/90335—Query processing
- G06F16/90344—Query processing by using string matching techniques
Landscapes
- Engineering & Computer Science (AREA)
- Databases & Information Systems (AREA)
- Theoretical Computer Science (AREA)
- Computational Linguistics (AREA)
- Data Mining & Analysis (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明实施例提供一种NFA到DFA的转换方法及装置,所述方法包括:基于创建临时跳转闭包NFA状态编号数组的方式,确定与NFA状态集合对应的跳转NFA状态编号有序列表;根据所述跳转NFA状态编号有序列表创建DFA状态;构建各DFA状态之间的跳转关系,完成NFA到DFA的转换。本发明实施例由于采用基于创建临时跳转闭包NFA状态编号数组的方式确定与NFA状态集合对应的跳转NFA状态编号有序列表,因此,相对于传统的基于Map数据结构的处理方式,本发明实施例具有“无须计算哈希值”和“无须比较多次”的优点,因此,能够节省CPU资源,减少NFA转DFA的执行时间,进而可以提升正则表达式匹配的整体性能。
Description
技术领域
本发明涉及计算机技术领域,尤其涉及一种NFA到DFA的转换方法及装置。
背景技术
现有的正则表达式匹配引擎,先将正则表达式编译为NFA(非确定有穷自动机,Non-deterministic finite automaton)。然后,使用“子集构造法”将NFA转换为DFA(确定有穷自动机,Deterministic finite automaton)。最后,采用DFA执行匹配任务。
目前在使用“子集构造法”将NFA转换为DFA时,一般基于Map数据结构的处理方式,但是这种处理方式的缺点是:NFA转换为DFA的执行时间较长,不仅浪费了CPU资源,而且降低了正则表达式匹配引擎的整体性能。
发明内容
针对现有技术中的问题,本发明实施例提供一种NFA到DFA的转换方法及装置。
具体地,本发明实施例提供了以下技术方案:
第一方面,本发明实施例提供了一种NFA到DFA的转换方法,包括:
基于创建临时跳转闭包NFA状态编号数组的方式,确定与NFA状态集合对应的跳转NFA状态编号有序列表;所述临时跳转闭包NFA状态编号数组的长度为NFA状态集合中包含的NFA状态的总量,数组中的有效值为与NFA状态集合中的各个NFA状态对应的跳转闭包NFA状态编号;所述跳转NFA状态编号有序列表中包含有与NFA状态集合中的各个NFA状态对应的跳转闭包NFA状态编号;
根据所述跳转NFA状态编号有序列表创建DFA状态;
根据各DFA状态中包含的NFA状态之间的跳转关系,构建各DFA状态之间的跳转关系,完成NFA到DFA的转换。
进一步地,所述基于创建临时跳转闭包NFA状态编号数组的方式,确定与NFA状态集合对应的跳转NFA状态编号有序列表,具体包括:
当NFA状态集合中包含多个NFA状态时,创建临时跳转闭包NFA状态编号数组;其中,所述数组的长度为所述NFA状态集合中包含的NFA状态总量;
在所述数组的基础上逐步叠加所述NFA状态集合中包含的多个NFA状态的跳转闭包NFA状态编号;
遍历所述数组中的有效值,得到与NFA状态集合对应的跳转NFA状态编号有序列表。
进一步地,所述根据所述跳转NFA状态编号有序列表创建DFA状态,具体包括:
采用Radix树检索跳转NFA状态编号有序列表,若不存在相同的DFA状态,则创建新的DFA状态,同时将跳转NFA状态编号有序列表和新建的DFA状态添加到Radix树。
进一步地,所述采用Radix树检索跳转NFA状态编号有序列表,若不存在相同的DFA状态,则创建新的DFA状态,同时将跳转NFA状态编号有序列表和新建的DFA状态添加到Radix树,具体包括:
采用Radix树通过遍历的方式检索跳转NFA状态编号有序列表,将所述有序列表中的跳转闭包NFA状态编号逐个与Radix树中的节点比较,如果相等则继续执行,如果不相等则停止执行,如果NFA状态编号有序列表已全部遍历完毕,且存在相同的DFA状态,则表示匹配成功,否则表示匹配失败,如果匹配失败,则创建新的DFA状态,同时将跳转NFA状态编号有序列表和新建的DFA状态添加到Radix树。
进一步地,所述构建各DFA状态之间的跳转关系,完成NFA到DFA的转换,具体包括:
当跳转边列表包含多个跳转边时,执行处理过程:
若开始字符等于倒数第二条跳转边的结束字符+1,且跳转的DFA状态与倒数第二条跳转边的DFA状态相同,则将倒数第二条跳转边的结束字符更新为结束字符;
若开始字符等于倒数第二条跳转边的结束字符+1,且跳转的DFA状态与倒数第二条跳转边的DFA状态不相同,则在跳转边列表的倒数第一个位置添加跳转边(开始字符,结束字符,跳转的DFA状态);
若开始字符不等于倒数第二条跳转边的结束字符+1,则在跳转边列表的倒数第一个位置添加跳转边(倒数第二条跳转边的结束字符+1,开始字符-1,null),以及,在跳转边列表的最后一个位置添加跳转边(开始字符,结束字符,跳转的DFA状态);
检测结束字符是否等于字符集最大索引,若等于,则将倒数第一条跳转边从跳转边列表中移除,若不等于,则将倒数第一条跳转边的开始字符修改为结束字符+1。
进一步地,所述构建各DFA状态之间的跳转关系,完成NFA到DFA的转换,具体包括:
当跳转边列表仅包含一个跳转边时,执行处理过程:
若开始字符等于0且结束字符等于字符集最大索引,则清空跳转边列表,并向跳转边列表中添加一个跳转边(开始字符,结束字符,跳转的DFA状态);
若开始字符等于0且结束字符不等于字符集最大索引,则清空跳转边列表,并向跳转边列表中添加两个跳转边(开始字符,结束字符,跳转的DFA状态)和(结束字符+1,字符集最大索引,null);
若开始字符不等于0且结束字符等于字符集最大索引,则清空跳转边列表,并向跳转边列表中添加两个跳转边(0,开始字符-1,null)和(开始字符,结束字符,跳转的DFA状态);
若开始字符不等于0且结束字符不等于字符集最大索引,则清空跳转边列表,并向跳转边列表中添加三个跳转边(0,开始字符-1,null)、(开始字符,结束字符,跳转的DFA状态)和(结束字符+1,字符集最大索引)。
第二方面,本发明实施例还提供了一种NFA到DFA的转换装置,包括:
确定模块,用于基于创建临时跳转闭包NFA状态编号数组的方式,确定与NFA状态集合对应的跳转NFA状态编号有序列表;所述临时跳转闭包NFA状态编号数组的长度为NFA状态集合中包含的NFA状态的总量,数组中的有效值为与NFA状态集合中的各个NFA状态对应的跳转闭包NFA状态编号;所述跳转NFA状态编号有序列表中包含有与NFA状态集合中的各个NFA状态对应的跳转闭包NFA状态编号;
创建模块,用于根据所述跳转NFA状态编号有序列表创建DFA状态;
构建模块,用于根据各DFA状态中包含的NFA状态之间的跳转关系,构建各DFA状态之间的跳转关系,完成NFA到DFA的转换。
第三方面,本发明实施例还提供了一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如第一方面所述NFA到DFA的转换方法的步骤。
第四方面,本发明实施例还提供了一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现如第一方面所述NFA到DFA的转换方法的步骤。
第五方面,本发明实施例还提供了一种计算机程序产品,所述计算机程序产品包括计算机可执行指令,所述指令在被执行时用于实现如第一方面所述NFA到DFA的转换方法的步骤。
由上面技术方案可知,本发明实施例提供的NFA到DFA的转换方法及装置,由于采用基于创建临时跳转闭包NFA状态编号数组的方式确定与NFA状态集合对应的跳转NFA状态编号有序列表,因此,相对于传统的基于Map数据结构的处理方式,本发明实施例具有“无须计算哈希值”和“无须比较多次”的优点,因此,能够节省CPU资源,减少NFA转DFA的执行时间,进而可以提升正则表达式匹配的整体性能。
此外,在本发明的其他实施例中,在创建DFA状态时,还可以进一步进行数据结构优化,例如采用“Radix树”检索“跳转NFA状态编号有序列表gotoNfaStateIdList”的方式创建DFA状态,较传统的基于Map数据结构的处理方式相比,本发明实施例提供的采用“Radix树”检索“跳转NFA状态编号有序列表gotoNfaStateIdList”创建DFA状态的方式,无须计算哈希值,直接比较NFA状态编号值即可,并且“Radix树”较Map内存空间利用率更高,因此更适应于“NFA转DFA”过程中“DFA状态数量爆炸”的情形。
此外,在本发明的其他实施例中,在构建各DFA状态之间的跳转关系时,还可以进一步进行数据结构优化,例如采用后续图3所示的跳转关系构建方式,该构建方式最多仅需要与倒数两个元素比较,因此,比较次数较少,执行速度较快。
由此可见,本发明实施例可以分别在确定跳转NFA状态编号有序列表、创建DFA状态和构建各DFA状态之间的跳转关系三个阶段采用合理的数据结构,从而可以有效优化“子集构造法”,减少NFA转DFA执行时间,节省CPU资源。此外,由于可以减少NFA转DFA执行时间,进而可以提升正则表达式匹配整体性能。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明一实施例提供的NFA到DFA的转换方法的流程图;
图2为本发明一实施例提供的确定与NFA状态集合对应的跳转NFA状态编号有序列表的处理过程示意图;
图3为本发明一实施例提供的Radix树的结构示意图;
图4为本发明一实施例提供的构建各DFA状态之间的跳转关系的处理过程示意图;
图5为本发明一实施例提供的NFA到DFA的转换装置的结构示意图;
图6为本发明一实施例提供的电子设备的结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
随着网络技术的不断发展,网络安全问题日益凸显,内容安全也越来越受到重视。为此,网络安全系统得到应用,它能够有效阻止有害信息的网络传播。目前主要的网络安全系统有入侵检测系统(Intrusion Detection System,IDS)和入侵防御系统(IntrusionPrevention System,IPS)等。通过对入侵行为的检测,来加强信息安全防御能力。在现有的IDS或者IPS中,例如Snort、BRO等,多数采用设定规则的方式对网络数据包进行包头或者/和内容的检查,符合指定规则的数据包,根据规则对应的处理办法进行处理,或是转发,或是日志,或是删除等。例如,通过对网络数据包进行病毒特征的检测,当检测到携带有病毒的数据包时,拒绝将数据包上传至主机,从而避免主机受到病毒的入侵。可见,通过设定规则进行数据包安全校验的方法,能够有效解决网络安全问题。在进行网络安全规则设定时一般利用正则表达式的方式将规则表达出来,然后利用设定好的正则表达式进行规则匹配。在利用正则表达式进行规则匹配时,通常会将其转换为非确定有限状态机(Nondeterministic Finite Automation,NFA)或确定有限自动机(Deterministic FiniteAutomata,DFA),利用状态的跳转来进行匹配。由于DFA具有线性时间复杂度,较NFA匹配速度较快。对实时性要求较高的网络安全检测领域,是否可以快速有效地将NFA转换为DFA,直接决定了正则表达式引擎采用DFA还是NFA执行匹配任务。正如背景技术部分所述,针对“NFA转换为DFA”的“子集构造法”,目前一般基于Map数据结构的处理方式将NFA转换为DFA,这种处理方式的缺点是:NFA转换为DFA的执行时间较长,不仅浪费了CPU资源,而且降低了正则表达式匹配引擎的整体性能。针对该问题,本发明实施例提供了一种NFA到DFA的转换方法及装置,本发明实施例针对“NFA转换为DFA”的“子集构造法”,采用了合理的数据结构,实现了一种快速的NFA到DFA转换算法,用以解决“NFA到DFA转换”执行时间较长,消耗较多CPU资源的问题。本发明实施例采用合理的数据结构,加快了NFA转换DFA速度,节省了CPU资源,提升了正则表达式匹配引擎的整体性能。下面将通过具体实施例对本发明提供的NFA到DFA的转换方法及装置进行详细说明。
图1示出了本发明实施例提供的NFA到DFA的转换方法的流程图。如图1所示,本发明实施例提供的NFA到DFA的转换方法包括如下步骤:
步骤101:基于创建临时跳转闭包NFA状态编号数组的方式,确定与NFA状态集合对应的跳转NFA状态编号有序列表;
在本步骤中,所述临时跳转闭包NFA状态编号数组的长度为NFA状态集合中包含的NFA状态的总量,数组中的有效值为与NFA状态集合中的各个NFA状态对应的跳转闭包NFA状态编号;所述跳转NFA状态编号有序列表中包含有与NFA状态集合中的各个NFA状态对应的跳转闭包NFA状态编号。本步骤采用基于创建临时跳转闭包NFA状态编号数组的方式,确定与NFA状态集合对应的跳转NFA状态编号有序列表。
在本步骤中,需要说明的是,需要确定DFA状态跳转包含的“NFA状态集合gotoNfaStateSet”,以及对应的“跳转NFA状态编号有序列表gotoNfaStateIdList”。如果“NFA状态集合gotoNfaStateSet”只有一个NFA状态,则“跳转NFA状态编号有序列表gotoNfaStateIdList”为此NFA状态的闭包NFA状态编号的有序列表。如果“NFA状态集合gotoNfaStateSet”包含多个NFA状态,则“跳转NFA状态编号有序列表gotoNfaStateIdList”为“NFA状态集合gotoNfaStateSet”中所有NFA状态的闭包NFA状态编号的有序列表。
在本步骤中,采用基于创建临时跳转闭包NFA状态编号数组的方式,确定与NFA状态集合对应的跳转NFA状态编号有序列表是指:首先,创建一个“临时跳转闭包NFA状态编号数组tempGotoClosureNfaStateArray”,并且使得此数组的长度为“NFA状态集合包含的NFA状态总量”。然后,在此数组基础上逐步叠加“所述NFA状态集合中包含的多个NFA状态的跳转闭包NFA状态编号”。最后,遍历“临时跳转闭包NFA状态编号数组tempGotoClosureNfaStateArray”中的有效值得到“跳转NFA状态编号有序列表gotoNfaStateIdList”。较传统的Map数据结构相比,本实施例提供的这种处理方式具有“无须计算哈希值”和“无须比较多次”的优点,该步骤的具体处理过程可参见图2所示。在本实施例中,有效值是指:数组中非空的值,由于数组中有些位置是不存在值的,因此,需要遍历数组中的有效值得到跳转NFA状态编号有序列表。
在本步骤中,所述临时跳转闭包NFA状态编号数组长度大小为“NFA包含的NFA状态总量”,有效值为与NFA状态集合中的各个NFA转改对应的跳转闭包NFA状态编号,无效值默认为空,所述跳转NFA状态编号有序列表由上述“临时跳转闭包NFA状态编号数组”转换得到,除去无效值,只保留了有效值。
在本步骤中,举例来说,有序列表如下所示:[<0~10,[NFA001,NFA002]>,<a~d,[NFA002]>,<x~z,[NFA003,NFA004,NFA005]>]
需要说明的是,此有序列表包含三个元素,各个元素分别表示“跳转字符区间”及其对应“跳转NFA状态集合”。例如:“<0~10,[NFA001,NFA002]>”,表示跳转字符集合0~10,对应的跳转NFA集合中的元素为“NFA001”和“NFA002”。
由上面技术方案可知,本发明实施例提供的NFA到DFA的转换方法,由于步骤101采用基于创建临时跳转闭包NFA状态编号数组的方式确定跳转NFA状态编号有序列表,因此,相对于传统的基于Map数据结构的处理方式,具有“无须计算哈希值”和“无须比较多次”的优点,因此,能够节省CPU资源,减少NFA转DFA的执行时间,进而可以提升正则表达式匹配的整体性能。
步骤102:根据所述跳转NFA状态编号有序列表创建DFA状态;
在本步骤中,根据所述跳转NFA状态编号有序列表创建DFA状态。需要说明的是,需要先判定当前是否已存在DFA状态等价于“跳转NFA状态编号有序列表gotoNfaStateIdList”,如果不存在,则需要创建新的DFA状态。
在本步骤中,可以采用“Radix树”检索“跳转NFA状态编号有序列表gotoNfaStateIdList”。如果存在,则说明已有相同的DFA状态。如果不存在,则说明当前没有与之相同的DFA状态,需要创建新的DFA状态newDFAState,同时需要将“跳转NFA状态编号有序列表gotoNfaStateIdList”和“新建的DFA状态newDFAState”添加到“Radix树”。较传统的基于Map数据结构的处理方式相比,本实施例提供的采用“Radix树”检索的方式无须计算哈希值,直接比较NFA状态编号值即可,并且“Radix树”较Map内存空间利用率更高,更适应于“NFA转DFA”过程中“DFA状态数量爆炸”的情形。
在本步骤中,需要说明的是,本步骤102优选采用上面介绍的采用“Radix树”检索的方式,不过本发明对此不作限定,在实际应用中,还可以根据实际情况采用其他创建DFA状态的处理方式,例如也可以采用现有技术中较为常规的创建DFA状态的处理方式,本发明实施例对此不作限定。
步骤103:根据各DFA状态中包含的NFA状态之间的跳转关系,构建各DFA状态之间的跳转关系,完成NFA到DFA的转换。
在本步骤中,在构建各DFA状态之间的跳转关系时,可以采用如图4所示的处理过程。如图4所示,添加跳转的开始字符为gotoCharStart,添加跳转的结束字符为gotoCharEnd,添加跳转的DFA状态为gotoDfaState。创建“跳转边列表gotoEdgeList”,并添加元素“(0,255,null)”。
A、当“跳转边列表gotoEdgeList”有且只有一个元素(也称跳转边)时,执行下面处理过程:
如果开始字符gotoCharStart等于0,并且结束字符gotoCharEnd等于“字符集最大索引charSetMaxIndex”,则首先清空“跳转边列表gotoEdgeList”,然后,向“跳转边列表gotoEdgeList”添加一个元素“(gotoCharStart,gotoCharEnd,gotoDfaState)”。
如果开始字符gotoCharStart等于0,并且结束字符gotoCharEnd不等于“字符集最大索引charSetMaxIndex”。则首先清空“跳转边列表gotoEdgeList”,然后向“跳转边列表gotoEdgeList”添加两个元素“(gotoCharStart,gotoCharEnd,gotoDfaState)”和“(gotoCharEnd+1,charSetMaxIndex,null)”。
如果开始字符gotoCharStart不等于0,并且结束字符gotoCharEnd等于“字符集最大索引charSetMaxIndex”。则首先清空“跳转边列表gotoEdgeList”,然后向“跳转边列表gotoEdgeList”添加两个元素“(0,gotoCharStart-1,null)”和“(gotoCharStart,gotoCharEnd,gotoDfaState)”。
如果开始字符gotoCharStart不等于0,并且结束字符gotoCharEnd不等于“字符集最大索引charSetMaxIndex”。则首先清空“跳转边列表gotoEdgeList”,然后向“跳转边列表gotoEdgeList”添加三个元素“(0,gotoCharStart-1,null)”、“(gotoCharStart,gotoCharEnd,gotoDfaState)”和“(gotoCharEnd+1,charSetMaxIndex,null)”。
B、当“跳转边列表gotoEdgeList”有多个元素(也称跳转边)时,执行下面处理过程:
令“跳转边列表gotoEdgeList”中倒数第一条跳转边为end1GotoEdge,倒数第二条跳转边为end2GotoEdge,倒数第二条跳转边的结束字符为gotoCharEnd2,倒数第二条跳转边的DFA状态为为nowGotoDfaState。
如果开始字符gotoCharStart等于“gotoCharEnd2+1”,并且跳转的DFA状态gotoDfaState与nowGotoDfaState相同,则gotoCharEnd2更新为gotoCharEnd。
如果开始字符gotoCharStart等于“gotoCharEnd2+1”,并且跳转的DFA状态gotoDfaState与nowGotoDfaState不相同,则“跳转边列表gotoEdgeList”在倒数第一个位置添加“(gotoCharStart,gotoCharEnd,gotoDfaState)”。
如果开始字符gotoCharStart不等于“gotoCharEnd2+1”,则“跳转边列表gotoEdgeList”需要插入两条新边,即在倒数第一个位置添加“(gotoCharEnd2+1,gotoCharStart-1,null)”,在最后一个位置添加“(gotoCharStart,gotoCharEnd,gotoDfaState)”。
执行完上述步骤,检测“结束字符gotoCharEnd”是否等于“字符集最大索引charSetMaxIndex”。如果等于,则将“倒数第一条跳转边end1GotoEdge”从“跳转边列表gotoEdgeList”中移除。如果不等于,则将“倒数第一条跳转边end1GotoEdge”的开始字符修改为“gotoCharEnd+1”。
需要说明的是,由于上述方法最多仅需要与倒数两个元素比较,因此,比较次数较少,执行速度较快。
在本步骤中,需要说明的是,本步骤103优选采用图4所示的处理方式,不过本发明对此不作限定,在实际应用中,还可以根据实际情况采用其他构建各DFA状态之间跳转关系的处理方式,例如也可以采用现有技术中较为常规的处理方式,本发明实施例对此不作限定。
由上面技术方案可知,本发明实施例提供的NFA到DFA的转换方法,由于在确定跳转NFA状态编号有序列表时,采用了基于创建临时跳转闭包NFA状态编号数组的处理方式,相对于传统的基于Map数据结构的处理方式,本发明实施例具有“无须计算哈希值”和“无须比较多次”的优点,因此,能够节省CPU资源,减少NFA转DFA的执行时间,进而可以提升正则表达式匹配的整体性能。此外,需要说明的是,在步骤102创建DFA状态时,还可以进一步进行数据结构优化,例如可以采用“Radix树”检索“跳转NFA状态编号有序列表gotoNfaStateIdList”的方式创建DFA状态,较传统的基于Map数据结构的处理方式相比,本实施例提供的采用“Radix树”检索“跳转NFA状态编号有序列表gotoNfaStateIdList”创建DFA状态的方式,无须计算哈希值,直接比较NFA状态编号值即可,并且“Radix树”较Map内存空间利用率更高,因此更适应于“NFA转DFA”过程中“DFA状态数量爆炸”的情形。此外,需要说明的是,在步骤103构建各DFA状态之间的跳转关系时,还可以进一步进行数据结构优化,例如,可以采用图4介绍的跳转关系构建方式,由于图4介绍的跳转关系构建方式最多仅需要与倒数两个元素比较,因此,比较次数较少,执行速度较快。由此可见,本发明实施例可以分别在步骤101、102和步骤103采用合理的数据结构,从而可以有效优化“子集构造法”,减少NFA转DFA执行时间,节省CPU资源。此外,由于可以减少NFA转DFA执行时间,进而可以提升正则表达式匹配整体性能。
基于上述实施例的内容,在本实施例中,所述步骤101基于创建临时跳转闭包NFA状态编号数组的方式,确定与NFA状态集合对应的跳转NFA状态编号有序列表,具体可通过如下方式实现:
当NFA状态集合中包含多个NFA状态时,创建临时跳转闭包NFA状态编号数组;其中,所述数组的长度为所述NFA状态集合中包含的NFA状态总量;
在所述数组的基础上逐步叠加所述NFA状态集合中包含的多个NFA状态的跳转闭包NFA状态编号;
遍历所述数组中的有效值,得到与NFA状态集合对应的跳转NFA状态编号有序列表。
需要说明的是,本实施例提供的确定与NFA状态集合对应的跳转NFA状态编号有序列表的方法,通过创建临时跳转闭包NFA状态编号数组,使得整个处理过程较为简单,相对于传统的基于Map数据结构的处理方式,本发明实施例具有“无须计算哈希值”和“无须比较多次”的优点,由此可见,本实施例由于采用了合理的数据结构,从而使得在确定跳转NFA状态编号有序列表时,“无须计算哈希值”和“无须比较多次”,从而使得执行速度较快,减少了NFA转DFA执行时间,节省了CPU资源。
基于上述实施例的内容,在本实施例中,所述步骤102根据所述跳转NFA状态编号有序列表创建DFA状态,具体可通过如下方式实现:
采用Radix树检索跳转NFA状态编号有序列表,若不存在相同的DFA状态,则创建新的DFA状态,同时将跳转NFA状态编号有序列表和新建的DFA状态添加到Radix树。
在本实施例中,采用Radix树通过遍历的方式检索跳转NFA状态编号有序列表,逐个元素与Radix比较,如果相等则继续执行,如果不相等则停止执行,如果NFA状态编号有序列表已全部遍历完毕,且存在相同的DFA状态,则表示匹配成功,否则表示匹配失败,如果匹配失败,则创建新的DFA状态,同时将跳转NFA状态编号有序列表和新建的DFA状态添加到Radix树。
如图3所示,Radix采用树形结构,查找速度较快,且与HashMap相比具有较小的存储空间。如图3所示,最上方的R节点表示树根。查找0123,即为图3右半部分所示,分别遍历0节点->1节点->2节点->3节点,得到最终结构3节点,查找成功。查找123节点,分别遍历0节点->2节点,但是没有搜索到3节点,则表示查找失败,且需要创建3节点。
需要说明的是,本实施例提供的采用“Radix树”检索跳转NFA状态编号有序列表进而创建DFA状态的方法,无须计算哈希值,直接比较NFA状态编号值即可,因此,执行速度较快,减少了NFA转DFA执行时间,节省了CPU资源,并且“Radix树”较Map内存空间利用率更高,因此,更适应于“NFA转DFA”过程中“DFA状态数量爆炸”的情形。由此可知,本实施例在创建DFA状态的过程中采用了合理的数据结构,从而优化了“子集构造法”,减少了NFA转DFA执行时间,节省了CPU资源。
基于上述实施例的内容,在本实施例中,所述步骤103构建各DFA状态之间的跳转关系,完成NFA到DFA的转换,具体可通过如下方式实现:
当跳转边列表包含多个跳转边时,执行处理过程:
若开始字符等于倒数第二条跳转边的结束字符+1,且跳转的DFA状态与倒数第二条跳转边的DFA状态相同,则将倒数第二条跳转边的结束字符更新为结束字符;
若开始字符等于倒数第二条跳转边的结束字符+1,且跳转的DFA状态与倒数第二条跳转边的DFA状态不相同,则在跳转边列表的倒数第一个位置添加跳转边(开始字符,结束字符,跳转的DFA状态);
若开始字符不等于倒数第二条跳转边的结束字符+1,则在跳转边列表的倒数第一个位置添加跳转边(倒数第二条跳转边的结束字符+1,开始字符-1,null),以及,在跳转边列表的最后一个位置添加跳转边(开始字符,结束字符,跳转的DFA状态);
检测结束字符是否等于字符集最大索引,若等于,则将倒数第一条跳转边从跳转边列表中移除,若不等于,则将倒数第一条跳转边的开始字符修改为结束字符+1。
在本实施例中,令跳转边列表中的倒数第一条跳转边为end1GotoEdge,倒数第二条跳转边为end2GotoEdge,倒数第二条跳转边的结束字符为gotoCharEnd2,倒数第二条跳转边的DFA状态为nowGotoDfaState,根据上面分析可知,如图4所示,当跳转边列表包含多个跳转边时,执行处理过程:
若开始字符gotoCharStart等于gotoCharEnd2+1,且跳转的DFA状态gotoDfaState与nowGotoDfaState相同,则将倒数第二条跳转边的结束字符gotoCharEnd2更新为gotoCharEnd;
若开始字符gotoCharStart等于gotoCharEnd2+1,且跳转的DFA状态gotoDfaState与nowGotoDfaState不相同,则在跳转边列表的倒数第一个位置添加(gotoCharStart,gotoCharEnd,gotoDfaState);
若开始字符gotoCharStart不等于gotoCharEnd2+1,则在跳转边列表的倒数第一个位置添加跳转边(gotoCharEnd2+1,gotoCharStart-1,null),以及,在跳转边列表的最后一个位置添加跳转边(gotoCharStart,gotoCharEnd,gotoDfaState);
检测结束字符gotoCharEnd是否等于字符集最大索引,若等于,则将倒数第一条跳转边end1GotoEdge从跳转边列表中移除,若不等于,则将倒数第一条跳转边end1GotoEdge的开始字符修改为gotoCharEnd+1。
需要说明的是,本实施例提供的构建各DFA状态之间的跳转关系的方法,采用了合理的数据结构,使得最多仅需要与跳转边列表倒数两个元素比较,比较次数较少,执行速度较快,从而优化了“子集构造法”,减少了NFA转DFA执行时间,节省了CPU资源。
基于上述实施例的内容,在本实施例中,所述步骤103构建各DFA状态之间的跳转关系,完成NFA到DFA的转换,具体可通过如下方式实现:
当跳转边列表仅包含一个跳转边时,执行处理过程:
若开始字符等于0且结束字符等于字符集最大索引,则清空跳转边列表,并向跳转边列表中添加一个跳转边(开始字符,结束字符,跳转的DFA状态);
若开始字符等于0且结束字符不等于字符集最大索引,则清空跳转边列表,并向跳转边列表中添加两个跳转边(开始字符,结束字符,跳转的DFA状态)和(结束字符+1,字符集最大索引,null);
若开始字符不等于0且结束字符等于字符集最大索引,则清空跳转边列表,并向跳转边列表中添加两个跳转边(0,开始字符-1,null)和(开始字符,结束字符,跳转的DFA状态);
若开始字符不等于0且结束字符不等于字符集最大索引,则清空跳转边列表,并向跳转边列表中添加三个跳转边(0,开始字符-1,null)、(开始字符,结束字符,跳转的DFA状态)和(结束字符+1,字符集最大索引)。
在本实施例中,根据上面的描述可知,如图4所示,当跳转边列表仅包含一个跳转边时,执行处理过程:
若开始字符gotoCharStart等于0且结束字符gotoCharEnd等于字符集最大索引charSetMaxIndex,则清空跳转边列表,并向跳转边列表中添加一个跳转边(gotoCharStart,gotoCharEnd,gotoDfaState);
若开始字符gotoCharStart等于0且结束字符gotoCharEnd不等于字符集最大索引charSetMaxIndex,则清空跳转边列表,并向跳转边列表中添加两个跳转边(gotoCharStart,gotoCharEnd,gotoDfaState)和(gotoCharEnd+1,charSetMaxIndex,null);
若开始字符gotoCharStart不等于0且结束字符gotoCharEnd等于字符集最大索引charSetMaxIndex,则清空跳转边列表,并向跳转边列表中添加两个跳转边(0,gotoCharStart-1,null)和(gotoCharStart,gotoCharEnd,gotoDfaState);
若开始字符gotoCharStart不等于0且结束字符gotoCharEnd不等于字符集最大索引charSetMaxIndex,则清空跳转边列表,并向跳转边列表中添加三个跳转边(0,gotoCharStart-1,null)、(gotoCharStart,gotoCharEnd,gotoDfaState)和(gotoCharEnd+1,charSetMaxIndex,null)。
需要说明的是,本实施例提供的构建各DFA状态之间的跳转关系的方法,采用了合理的数据结构,使得最多仅需要与跳转边列表倒数两个元素比较,比较次数较少,执行速度较快,从而优化了“子集构造法”,减少了NFA转DFA执行时间,节省了CPU资源。
图5示出了本发明实施例提供的NFA到DFA的转换装置的结构示意图。如图5所示,本发明实施例提供的NFA到DFA的转换装置,包括:确定模块21、创建模块22和构建模块23,其中:
确定模块21,用于基于创建临时跳转闭包NFA状态编号数组的方式,确定与NFA状态集合对应的跳转NFA状态编号有序列表;所述临时跳转闭包NFA状态编号数组的长度为NFA状态集合中包含的NFA状态的总量,数组中的有效值为与NFA状态集合中的各个NFA状态对应的跳转闭包NFA状态编号;所述跳转NFA状态编号有序列表中包含有与NFA状态集合中的各个NFA状态对应的跳转闭包NFA状态编号;
创建模块22,用于根据所述跳转NFA状态编号有序列表创建DFA状态;
构建模块23,用于根据各DFA状态中包含的NFA状态之间的跳转关系,构建各DFA状态之间的跳转关系,完成NFA到DFA的转换。
进一步地,基于上述实施例,在本实施例中,所述确定模块21,具体用于:
当NFA状态集合中包含多个NFA状态时,创建临时跳转闭包NFA状态编号数组;其中,所述数组的长度为所述NFA状态集合中包含的NFA状态总量;
在所述数组的基础上逐步叠加所述NFA状态集合中包含的多个NFA状态的跳转闭包NFA状态编号;
遍历所述数组中的有效值,得到与NFA状态集合对应的跳转NFA状态编号有序列表。
进一步地,基于上述实施例,在本实施例中,所述创建模块22,具体用于:
采用Radix树检索跳转NFA状态编号有序列表,若不存在相同的DFA状态,则创建新的DFA状态,同时将跳转NFA状态编号有序列表和新建的DFA状态添加到Radix树。
进一步地,基于上述实施例,在本实施例中,所述创建模块22,具体用于:
采用Radix树通过遍历的方式检索跳转NFA状态编号有序列表,将所述有序列表中的跳转闭包NFA状态编号逐个与Radix树中的节点比较,如果相等则继续执行,如果不相等则停止执行,如果NFA状态编号有序列表已全部遍历完毕,且存在相同的DFA状态,则表示匹配成功,否则表示匹配失败,如果匹配失败,则创建新的DFA状态,同时将跳转NFA状态编号有序列表和新建的DFA状态添加到Radix树。
进一步地,基于上述实施例,在本实施例中,所述构建模块23,具体用于:
当跳转边列表包含多个跳转边时,执行处理过程:
若开始字符等于倒数第二条跳转边的结束字符+1,且跳转的DFA状态与倒数第二条跳转边的DFA状态相同,则将倒数第二条跳转边的结束字符更新为结束字符;
若开始字符等于倒数第二条跳转边的结束字符+1,且跳转的DFA状态与倒数第二条跳转边的DFA状态不相同,则在跳转边列表的倒数第一个位置添加跳转边(开始字符,结束字符,跳转的DFA状态);
若开始字符不等于倒数第二条跳转边的结束字符+1,则在跳转边列表的倒数第一个位置添加跳转边(倒数第二条跳转边的结束字符+1,开始字符-1,null),以及,在跳转边列表的最后一个位置添加跳转边(开始字符,结束字符,跳转的DFA状态);
检测结束字符是否等于字符集最大索引,若等于,则将倒数第一条跳转边从跳转边列表中移除,若不等于,则将倒数第一条跳转边的开始字符修改为结束字符+1。
进一步地,基于上述实施例,在本实施例中,所述构建模块23,具体用于:
当跳转边列表仅包含一个跳转边时,执行处理过程:
若开始字符等于0且结束字符等于字符集最大索引,则清空跳转边列表,并向跳转边列表中添加一个跳转边(开始字符,结束字符,跳转的DFA状态);
若开始字符等于0且结束字符不等于字符集最大索引,则清空跳转边列表,并向跳转边列表中添加两个跳转边(开始字符,结束字符,跳转的DFA状态)和(结束字符+1,字符集最大索引,null);
若开始字符不等于0且结束字符等于字符集最大索引,则清空跳转边列表,并向跳转边列表中添加两个跳转边(0,开始字符-1,null)和(开始字符,结束字符,跳转的DFA状态);
若开始字符不等于0且结束字符不等于字符集最大索引,则清空跳转边列表,并向跳转边列表中添加三个跳转边(0,开始字符-1,null)、(开始字符,结束字符,跳转的DFA状态)和(结束字符+1,字符集最大索引)。
由于本发明实施例提供的NFA到DFA的转换装置,可以用于执行上述实施例所述的NFA到DFA的转换方法,其工作原理和有益效果类似,故此处不再详述,具体内容可参见上述实施例的介绍。
基于相同的发明构思,本发明又一实施例提供了一种电子设备,参见图6,所述电子设备具体包括如下内容:处理器501、存储器502、通信接口503和通信总线504;
其中,所述处理器501、存储器502、通信接口503通过所述通信总线504完成相互间的通信;
所述处理器501用于调用所述存储器502中的计算机程序,所述处理器执行所述计算机程序时实现上述NFA到DFA的转换方法的全部步骤,例如,所述处理器执行所述计算机程序时实现下述过程:基于创建临时跳转闭包NFA状态编号数组的方式,确定与NFA状态集合对应的跳转NFA状态编号有序列表;所述临时跳转闭包NFA状态编号数组的长度为NFA状态集合中包含的NFA状态的总量,数组中的有效值为与NFA状态集合中的各个NFA状态对应的跳转闭包NFA状态编号;所述跳转NFA状态编号有序列表中包含有与NFA状态集合中的各个NFA状态对应的跳转闭包NFA状态编号;根据所述跳转NFA状态编号有序列表创建DFA状态;根据各DFA状态中包含的NFA状态之间的跳转关系,构建各DFA状态之间的跳转关系,完成NFA到DFA的转换。
可以理解的是,所述计算机程序可以执行的细化功能和扩展功能可参照上面实施例的描述。
基于相同的发明构思,本发明又一实施例提供了一种非暂态计算机可读存储介质,该非暂态计算机可读存储介质上存储有计算机程序,该计算机程序被处理器执行时实现上述NFA到DFA的转换方法的全部步骤,例如,所述处理器执行所述计算机程序时实现下述过程:基于创建临时跳转闭包NFA状态编号数组的方式,确定与NFA状态集合对应的跳转NFA状态编号有序列表;所述临时跳转闭包NFA状态编号数组的长度为NFA状态集合中包含的NFA状态的总量,数组中的有效值为与NFA状态集合中的各个NFA状态对应的跳转闭包NFA状态编号;所述跳转NFA状态编号有序列表中包含有与NFA状态集合中的各个NFA状态对应的跳转闭包NFA状态编号;根据所述跳转NFA状态编号有序列表创建DFA状态;根据各DFA状态中包含的NFA状态之间的跳转关系,构建各DFA状态之间的跳转关系,完成NFA到DFA的转换。
可以理解的是,所述计算机程序可以执行的细化功能和扩展功能可参照上面实施例的描述。
基于相同的发明构思,本发明又一实施例提供了一种计算机程序产品,所述计算机程序产品包括计算机可执行指令,所述指令在被执行时用于实现上述NFA到DFA的转换方法的全部步骤,例如,所述指令在被执行时实现下述过程:基于创建临时跳转闭包NFA状态编号数组的方式,确定与NFA状态集合对应的跳转NFA状态编号有序列表;所述临时跳转闭包NFA状态编号数组的长度为NFA状态集合中包含的NFA状态的总量,数组中的有效值为与NFA状态集合中的各个NFA状态对应的跳转闭包NFA状态编号;所述跳转NFA状态编号有序列表中包含有与NFA状态集合中的各个NFA状态对应的跳转闭包NFA状态编号;根据所述跳转NFA状态编号有序列表创建DFA状态;根据各DFA状态中包含的NFA状态之间的跳转关系,构建各DFA状态之间的跳转关系,完成NFA到DFA的转换。
此外,上述的存储器中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本发明实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的NFA到DFA的转换方法。
此外,在本发明中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
此外,在本发明中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不必须针对的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任一个或多个实施例或示例中以合适的方式结合。此外,在不相互矛盾的情况下,本领域的技术人员可以将本说明书中描述的不同实施例或示例以及不同实施例或示例的特征进行结合和组合。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
Claims (10)
1.一种NFA到DFA的转换方法,其特征在于,包括:
基于创建临时跳转闭包NFA状态编号数组的方式,确定与NFA状态集合对应的跳转NFA状态编号有序列表;所述临时跳转闭包NFA状态编号数组的长度为NFA状态集合中包含的NFA状态的总量,数组中的有效值为与NFA状态集合中的各个NFA状态对应的跳转闭包NFA状态编号;所述跳转NFA状态编号有序列表中包含有与NFA状态集合中的各个NFA状态对应的跳转闭包NFA状态编号;
根据所述跳转NFA状态编号有序列表创建DFA状态;
根据各DFA状态中包含的NFA状态之间的跳转关系,构建各DFA状态之间的跳转关系,完成NFA到DFA的转换。
2.根据权利要求1所述的NFA到DFA的转换方法,其特征在于,所述基于创建临时跳转闭包NFA状态编号数组的方式,确定与NFA状态集合对应的跳转NFA状态编号有序列表,具体包括:
当NFA状态集合中包含多个NFA状态时,创建临时跳转闭包NFA状态编号数组;其中,所述数组的长度为所述NFA状态集合中包含的NFA状态总量;
在所述数组的基础上逐步叠加所述NFA状态集合中包含的多个NFA状态的跳转闭包NFA状态编号;
遍历所述数组中的有效值,得到与NFA状态集合对应的跳转NFA状态编号有序列表。
3.根据权利要求1所述的NFA到DFA的转换方法,其特征在于,所述根据所述跳转NFA状态编号有序列表创建DFA状态,具体包括:
采用Radix树检索跳转NFA状态编号有序列表,若不存在相同的DFA状态,则创建新的DFA状态,同时将跳转NFA状态编号有序列表和新建的DFA状态添加到Radix树。
4.根据权利要求3所述的NFA到DFA的转换方法,其特征在于,所述采用Radix树检索跳转NFA状态编号有序列表,若不存在相同的DFA状态,则创建新的DFA状态,同时将跳转NFA状态编号有序列表和新建的DFA状态添加到Radix树,具体包括:
采用Radix树通过遍历的方式检索跳转NFA状态编号有序列表,将所述有序列表中的跳转闭包NFA状态编号逐个与Radix树中的节点比较,如果相等则继续执行,如果不相等则停止执行,如果NFA状态编号有序列表已全部遍历完毕,且存在相同的DFA状态,则表示匹配成功,否则表示匹配失败,如果匹配失败,则创建新的DFA状态,同时将跳转NFA状态编号有序列表和新建的DFA状态添加到Radix树。
5.根据权利要求1所述的NFA到DFA的转换方法,其特征在于,所述构建各DFA状态之间的跳转关系,完成NFA到DFA的转换,具体包括:
当跳转边列表包含多个跳转边时,执行处理过程:
若开始字符等于倒数第二条跳转边的结束字符+1,且跳转的DFA状态与倒数第二条跳转边的DFA状态相同,则将倒数第二条跳转边的结束字符更新为结束字符;
若开始字符等于倒数第二条跳转边的结束字符+1,且跳转的DFA状态与倒数第二条跳转边的DFA状态不相同,则在跳转边列表的倒数第一个位置添加跳转边(开始字符,结束字符,跳转的DFA状态);
若开始字符不等于倒数第二条跳转边的结束字符+1,则在跳转边列表的倒数第一个位置添加跳转边(倒数第二条跳转边的结束字符+1,开始字符-1,null),以及,在跳转边列表的最后一个位置添加跳转边(开始字符,结束字符,跳转的DFA状态);
检测结束字符是否等于字符集最大索引,若等于,则将倒数第一条跳转边从跳转边列表中移除,若不等于,则将倒数第一条跳转边的开始字符修改为结束字符+1。
6.根据权利要求1所述的NFA到DFA的转换方法,其特征在于,所述构建各DFA状态之间的跳转关系,完成NFA到DFA的转换,具体包括:
当跳转边列表仅包含一个跳转边时,执行处理过程:
若开始字符等于0且结束字符等于字符集最大索引,则清空跳转边列表,并向跳转边列表中添加一个跳转边(开始字符,结束字符,跳转的DFA状态);
若开始字符等于0且结束字符不等于字符集最大索引,则清空跳转边列表,并向跳转边列表中添加两个跳转边(开始字符,结束字符,跳转的DFA状态)和(结束字符+1,字符集最大索引,null);
若开始字符不等于0且结束字符等于字符集最大索引,则清空跳转边列表,并向跳转边列表中添加两个跳转边(0,开始字符-1,null)和(开始字符,结束字符,跳转的DFA状态);
若开始字符不等于0且结束字符不等于字符集最大索引,则清空跳转边列表,并向跳转边列表中添加三个跳转边(0,开始字符-1,null)、(开始字符,结束字符,跳转的DFA状态)和(结束字符+1,字符集最大索引)。
7.一种NFA到DFA的转换装置,其特征在于,包括:
确定模块,用于基于创建临时跳转闭包NFA状态编号数组的方式,确定与NFA状态集合对应的跳转NFA状态编号有序列表;所述临时跳转闭包NFA状态编号数组的长度为NFA状态集合中包含的NFA状态的总量,数组中的有效值为与NFA状态集合中的各个NFA状态对应的跳转闭包NFA状态编号;所述跳转NFA状态编号有序列表中包含有与NFA状态集合中的各个NFA状态对应的跳转闭包NFA状态编号;
创建模块,用于根据所述跳转NFA状态编号有序列表创建DFA状态;
构建模块,用于根据各DFA状态中包含的NFA状态之间的跳转关系,构建各DFA状态之间的跳转关系,完成NFA到DFA的转换。
8.一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现如权利要求1至6任一项所述NFA到DFA的转换方法的步骤。
9.一种非暂态计算机可读存储介质,其上存储有计算机程序,其特征在于,该计算机程序被处理器执行时实现如权利要求1至6任一项所述NFA到DFA的转换方法的步骤。
10.一种计算机程序产品,所述计算机程序产品包括计算机可执行指令,其特征在于,所述指令在被执行时用于实现根据权利要求1至6任一项所述NFA到DFA的转换方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911415263.8A CN111078963B (zh) | 2019-12-31 | 2019-12-31 | Nfa到dfa的转换方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911415263.8A CN111078963B (zh) | 2019-12-31 | 2019-12-31 | Nfa到dfa的转换方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111078963A true CN111078963A (zh) | 2020-04-28 |
CN111078963B CN111078963B (zh) | 2023-08-15 |
Family
ID=70320852
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201911415263.8A Active CN111078963B (zh) | 2019-12-31 | 2019-12-31 | Nfa到dfa的转换方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111078963B (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111753150A (zh) * | 2020-05-15 | 2020-10-09 | 中国科学院信息工程研究所 | 一种基于图搜索方法加速epsilon闭包计算的方法及系统 |
CN111753144A (zh) * | 2020-05-15 | 2020-10-09 | 中国科学院信息工程研究所 | 一种基于Warshall方法加速epsilon闭包计算的方法及系统 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2008036501A2 (en) * | 2006-09-19 | 2008-03-27 | Netlogic Microsystems, Inc. | Regular expression searching of packet contents using dedicated search circuits |
WO2008141519A1 (fr) * | 2007-05-18 | 2008-11-27 | Beijing Zhean Technology Corporation | Méthode et structure de puce de mise en concordance de chaînes de caractères |
CN101599074A (zh) * | 2009-06-26 | 2009-12-09 | 华为技术有限公司 | 正则表达式匹配的方法及装置 |
-
2019
- 2019-12-31 CN CN201911415263.8A patent/CN111078963B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2008036501A2 (en) * | 2006-09-19 | 2008-03-27 | Netlogic Microsystems, Inc. | Regular expression searching of packet contents using dedicated search circuits |
WO2008141519A1 (fr) * | 2007-05-18 | 2008-11-27 | Beijing Zhean Technology Corporation | Méthode et structure de puce de mise en concordance de chaînes de caractères |
CN101599074A (zh) * | 2009-06-26 | 2009-12-09 | 华为技术有限公司 | 正则表达式匹配的方法及装置 |
Non-Patent Citations (1)
Title |
---|
王建敏;曾凡平;王健康;: "用优化的正则表达式引擎进行快速网络流分类", 小型微型计算机系统 * |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111753150A (zh) * | 2020-05-15 | 2020-10-09 | 中国科学院信息工程研究所 | 一种基于图搜索方法加速epsilon闭包计算的方法及系统 |
CN111753144A (zh) * | 2020-05-15 | 2020-10-09 | 中国科学院信息工程研究所 | 一种基于Warshall方法加速epsilon闭包计算的方法及系统 |
CN111753150B (zh) * | 2020-05-15 | 2023-10-13 | 中国科学院信息工程研究所 | 一种基于图搜索方法加速epsilon闭包计算的方法及系统 |
CN111753144B (zh) * | 2020-05-15 | 2023-10-17 | 中国科学院信息工程研究所 | 一种基于Warshall方法加速epsilon闭包计算的方法及系统 |
Also Published As
Publication number | Publication date |
---|---|
CN111078963B (zh) | 2023-08-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9171153B2 (en) | Bloom filter with memory element | |
US7984044B2 (en) | System or program for searching documents | |
CN111971931B (zh) | 在区块链网络中验证交易的方法以及构成该网络的节点 | |
RU2523112C1 (ru) | Система и способ выбора оптимального типа антивирусной проверки при доступе к файлу | |
CN102870116B (zh) | 内容匹配方法和装置 | |
US8583961B2 (en) | Method and device for creating pattern matching state machine | |
CN111078963A (zh) | Nfa到dfa的转换方法及装置 | |
CN106062740B (zh) | 生成多个索引数据字段的方法和装置 | |
JP6467540B1 (ja) | ブロックチェーン・ネットワークにおいてトランザクションを検証するための方法及び当該ネットワークを構成するためのノード | |
CN111181980B (zh) | 一种面向网络安全的正则表达式的匹配方法及装置 | |
CN105335245B (zh) | 故障存储方法和装置、故障查找方法和装置 | |
CN115329961A (zh) | 一种基于有向无环图的依赖消除方法、装置及存储介质 | |
CN112351002B (zh) | 一种报文检测方法、装置及设备 | |
CN114363002A (zh) | 一种网络攻击关系图的生成方法及装置 | |
CN111262589B (zh) | 一种dfa空间压缩方法及装置 | |
CN110505238A (zh) | 基于edr的消息队列的处理装置和方法 | |
CN112994931B (zh) | 一种规则匹配的方法及其设备 | |
CN111259122B (zh) | 网络包检测方法及装置 | |
CN109194613B (zh) | 一种数据包检测方法和装置 | |
CN113765852B (zh) | 数据包的检测方法、系统、存储介质和计算设备 | |
CN110647664A (zh) | 一种知识图谱中树图大规模更新方法、系统、介质及设备 | |
CN112187700A (zh) | 一种waf安全规则匹配方法、设备及存储介质 | |
CN109213757A (zh) | 大数据索引优化方法和装置 | |
CN114338118B (zh) | 一种基于att&ck威胁检测的方法及装置 | |
CN111258960B (zh) | Nfa状态关系式的构建方法、字符串处理方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
CB02 | Change of applicant information | ||
CB02 | Change of applicant information |
Address after: Room 332, 3 / F, Building 102, 28 xinjiekouwei street, Xicheng District, Beijing 100088 Applicant after: QAX Technology Group Inc. Applicant after: Qianxin Wangshen information technology (Beijing) Co.,Ltd. Address before: Room 332, 3 / F, Building 102, 28 xinjiekouwei street, Xicheng District, Beijing 100088 Applicant before: QAX Technology Group Inc. Applicant before: LEGENDSEC INFORMATION TECHNOLOGY (BEIJING) Inc. |
|
GR01 | Patent grant | ||
GR01 | Patent grant |