專利名稱:Ac狀態(tài)機(jī)的構(gòu)建方法及裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及模式匹配技木,尤其涉及ー種AC狀態(tài)機(jī)的構(gòu)建方法及裝置。
背景技術(shù):
多模式匹配問題是計(jì)算機(jī)科學(xué)的基本問題之一,多模式匹配問題可以簡(jiǎn)單描述為當(dāng)存在一個(gè)搜尋文本和ー個(gè)搜尋模式集合吋,搜尋模式集合包括兩個(gè)以上的搜尋模式,每個(gè)搜尋模式通常是一字符串。在搜尋文本中查找搜尋模式集合中的各搜尋模式。比如搜尋■文本A為abcdefgl23456,搜尋■模式集合C為{abc、ef、tian、123、67、890}。那么,進(jìn)行多模式匹配后,輸出的結(jié)果就是搜尋文本A中包含搜尋模式abc、ef和123。多模式匹配只要掃描一遍搜尋文本,就能夠找出該搜尋文本匹配的所有搜尋模式,具有很高的匹配效率,廣泛用于入侵檢測(cè)、病毒檢測(cè)、搜索引擎和數(shù)據(jù)挖掘等領(lǐng)域。AC (Aho-Corasick)算法是ー種經(jīng)典的多模式匹配算法,能夠在任意的搜尋文本中定位任一個(gè)搜尋模式的所有位置。該算法利用有限自動(dòng)機(jī)巧妙地將字符比較轉(zhuǎn)化為狀態(tài)轉(zhuǎn)移。其原理是首先根據(jù)搜尋模式集合定義ー個(gè)有限狀態(tài)模式匹配機(jī),然后把搜尋文本作為模式匹配狀態(tài)機(jī)的輸入,只要匹配到搜尋模式,就會(huì)通報(bào)此搜尋模式成功。在標(biāo)準(zhǔn)的AC算法中,搜尋文本的每次輸入是ー個(gè)字節(jié)。以搜尋■模式集合{he、she、his、hers}為例,由此搜尋■模式集合構(gòu)建的AC狀態(tài)機(jī)如圖IA IC所不。圖IA 圖IC為現(xiàn)有技術(shù)AC狀態(tài)機(jī)的不意圖。圖IA的關(guān)鍵字樹中,每ー個(gè)圓圈表示ー個(gè)狀態(tài)節(jié)點(diǎn),每個(gè)狀態(tài)節(jié)點(diǎn)都包含三個(gè)重要數(shù)據(jù)轉(zhuǎn)移(goto)函數(shù)(圖1A)、失效(failure)函數(shù)(圖 1B)、輸出(output)函數(shù)(圖 1C)。其中,goto函數(shù)用于把ー個(gè)由狀態(tài)和輸入字符組成的ニ元組映射成另ー個(gè)狀態(tài)或是失效;failure函數(shù)用于把ー個(gè)狀態(tài)映射到另ー個(gè)狀態(tài)。當(dāng)goto函數(shù)報(bào)告失效時(shí),failure函數(shù)就會(huì)被詢問;output函數(shù),用于表示某個(gè)搜尋模式已經(jīng)被匹配。在基本AC狀態(tài)機(jī)的狀態(tài)遷移中,在當(dāng)前狀態(tài)S和輸入字符c下,下ー個(gè)狀態(tài)為操作I :如果goto (S,c)存在,那么下ー個(gè)狀態(tài)為goto (S,C),算法結(jié)束,否則,執(zhí)行操作2 ;操作2 :將failure (S)賦值給S,執(zhí)行操作I。由于在基本AC狀態(tài)機(jī)中,如果goto函數(shù)的結(jié)果不存在,就會(huì)導(dǎo)致一次或是多次的訪問failure函數(shù),為了提高AC狀態(tài)機(jī)的效率,現(xiàn)有技術(shù)提出ー種去failure的AC狀態(tài)機(jī)。在去failure的AC狀態(tài)機(jī)中,姆ー個(gè)狀態(tài)節(jié)點(diǎn)沒有failure函數(shù),而是把goto函數(shù)和failure函數(shù)統(tǒng)一為下一個(gè)狀態(tài)(nextstate)函數(shù)。去failure的AC狀態(tài)機(jī)的示意圖和標(biāo)準(zhǔn)AC狀態(tài)機(jī)的示意圖是ー樣的,只是每個(gè) 狀態(tài)節(jié)點(diǎn)下,不再有g(shù)oto函數(shù)和failure函數(shù),而是用nextstate函數(shù)替代。nextstate函數(shù)用于把ー個(gè)由狀態(tài)和輸入字符組成的ニ元組映射成另ー個(gè)狀態(tài)。即通過nextstate函數(shù),可獲知ー個(gè)確定的下ー個(gè)狀態(tài)。有了 nextstate函數(shù)后,AC狀態(tài)機(jī)的遷移就簡(jiǎn)單多了,在當(dāng)前狀態(tài)S和當(dāng)前輸入字符c下,那么下ー個(gè)狀態(tài)就是nextstate (S, c)。為了方便獲取nextstate函數(shù),每ー個(gè)狀態(tài)節(jié)點(diǎn)需保存下一個(gè)狀態(tài)表,每ー個(gè)狀態(tài)節(jié)點(diǎn)的下一個(gè)狀態(tài)表記錄在當(dāng)前狀態(tài)下,在不同的輸入字符時(shí)的下ー個(gè)狀態(tài)值,即在當(dāng)前狀態(tài)下,輸入某個(gè)字符,那么將遷移到哪ー個(gè)狀態(tài)。由于字符是ー個(gè)字節(jié),能夠表示美國(guó)信息互換標(biāo)準(zhǔn)代石馬(American Standard Code for Information Interchange,以下簡(jiǎn)稱ASCII)碼中的0 255。其 中,ASCII碼值表記錄的是用戶所看到的字符與計(jì)算機(jī)內(nèi)部的真正數(shù)值之間的映射,由于ー個(gè)字節(jié)的取值范圍是0 255,因而ASCII碼值表有256個(gè)單元。比如用戶看到的字母a,計(jì)算機(jī)內(nèi)部的保存數(shù)值是97 ;用戶看到的數(shù)字1,計(jì)算機(jī)內(nèi)部的保存數(shù)值是31,等等。因而下ー個(gè)狀態(tài)表是ー個(gè)具有256個(gè)成員的數(shù)組。以圖IA中的狀態(tài)節(jié)點(diǎn)I為例,狀態(tài)節(jié)點(diǎn)I在256個(gè)不同ASCII碼值輸入時(shí)的下一個(gè)狀態(tài)表,可以如表I所
/Jn o表I
0_0 _
I_0 _
2-100_0 _101_2_
102-104 _0 _
105 _6 _
106-255 _0 _表I中列出的是圖IA中狀態(tài)節(jié)點(diǎn)I的下一個(gè)狀態(tài)表,描述狀態(tài)節(jié)點(diǎn)I在256個(gè)不同的ASCII碼值輸入時(shí),狀態(tài)節(jié)點(diǎn)I的下一個(gè)狀態(tài);下一個(gè)狀態(tài)表是ー個(gè)數(shù)組(array),其中數(shù)組的下標(biāo)值用index表示在輸入的字符的ASCII碼值為數(shù)組下標(biāo)值時(shí),狀態(tài)節(jié)點(diǎn)I的下一個(gè)狀態(tài)節(jié)點(diǎn)的值為 nextstate (I, index) = array [index]。為了更好地理解,下面舉ー個(gè)例子以數(shù)組的下標(biāo)值為101為例,通過表I可以看出,當(dāng)數(shù)組下標(biāo)值為101時(shí),數(shù)組的值為2,即nextstate (1,101) = 2,表示在狀態(tài)節(jié)點(diǎn)I,當(dāng)輸入的字符的ASCII碼值為101時(shí),下一個(gè)狀態(tài)節(jié)點(diǎn)為狀態(tài)節(jié)點(diǎn)2,而ASCII碼值101正好對(duì)應(yīng)小寫字母e,即在狀態(tài)節(jié)點(diǎn)I時(shí),輸入字母e,那么下一個(gè)狀態(tài)節(jié)點(diǎn)為狀態(tài)節(jié)點(diǎn)2,這正如圖IA中所示。在使用去failure的AC狀態(tài)機(jī)進(jìn)行多模式匹配吋,以搜尋模式集合{he、his、hers、she}和搜尋■文本“his book not hers”為例,從去failure的AC狀態(tài)機(jī)的初始狀態(tài)開始,將搜尋文本的字符逐個(gè)輸入,重復(fù)下述的操作在當(dāng)前狀態(tài)節(jié)點(diǎn)下,從下ー個(gè)狀態(tài)表中,訪問對(duì)應(yīng)于當(dāng)前輸入字符的下ー個(gè)狀態(tài);然后,遷移到此下ー個(gè)狀態(tài)。當(dāng)搜尋■文本輸入結(jié)束,就能識(shí)別出搜尋■模式his和hers。在實(shí)際操作中,往往會(huì)出現(xiàn)包含通配符的搜尋模式,用“?”來表示,每ー個(gè)“?”代表ー個(gè)字符。例如a c表示搜尋模式具有這樣的特征三個(gè)字符,其中第一個(gè)字符為a,最后ー個(gè)字符為C,第二個(gè)字符為任意字符。再比如a c表示搜尋模式具有這樣的特征第一個(gè)字符為a,最后ー個(gè)字符為C,第二個(gè)字符為任意字符,第三個(gè)字符為任意字符。但是現(xiàn)有的AC狀態(tài)機(jī)只能處理確定的搜索模式,對(duì)于含有通配符“ ? ”的搜尋模式,AC狀態(tài)機(jī)無法處理,這大大減少了 AC狀態(tài)機(jī)的使用范圍。
發(fā)明內(nèi)容
本發(fā)明提供ー種AC狀態(tài)機(jī)的構(gòu)建方法及裝置,以使AC狀態(tài)機(jī)能夠處理含有通配符的搜尋模式。本發(fā)明的第一個(gè)方面是提供一種AC狀態(tài)機(jī)的構(gòu)建方法,包括將各搜尋模式中的各通配符設(shè)置為特定字符; 根據(jù)所述各搜尋模式構(gòu)建關(guān)鍵字樹,所述關(guān)鍵字樹包括各狀態(tài)節(jié)點(diǎn)、各狀態(tài)節(jié)點(diǎn)的goto函數(shù)表和output函數(shù)表,其中,將基于所述特定字符所轉(zhuǎn)移至的狀態(tài)節(jié)點(diǎn)視為通配符節(jié)點(diǎn);將所述通配符節(jié)點(diǎn)的goto函數(shù)表復(fù)制到兄弟狀態(tài)節(jié)點(diǎn)中,并記錄轉(zhuǎn)移至所述兄弟狀態(tài)節(jié)點(diǎn)的輸入字符為待排除字符,其中,所述兄弟狀態(tài)節(jié)點(diǎn)為與所述通配符節(jié)點(diǎn)具有同一上層狀態(tài)節(jié)點(diǎn)的狀態(tài)節(jié)點(diǎn);當(dāng)識(shí)別到復(fù)制goto函數(shù)表與兄弟狀態(tài)節(jié)點(diǎn)的原有g(shù)oto函數(shù)表存在不確定goto函數(shù)時(shí),將復(fù)制goto函數(shù)表中的不確定goto函數(shù)視為新goto函數(shù),原有g(shù)oto函數(shù)表中的不確定goto函數(shù)視為舊goto函數(shù);將新goto函數(shù)輸出值所對(duì)應(yīng)的狀態(tài)節(jié)點(diǎn)的goto函數(shù)表復(fù)制到舊goto函數(shù)輸出值所對(duì)應(yīng)的狀態(tài)節(jié)點(diǎn)的goto函數(shù)表中,去除新goto函數(shù),并返回執(zhí)行上述識(shí)別步驟,直至未識(shí)別到不確定goto函數(shù)為止;將所述特定字符轉(zhuǎn)換為所述通配符,并從所述通配符中排除所述兄弟狀態(tài)節(jié)點(diǎn)對(duì)應(yīng)的所有待排除字符。本發(fā)明的另一方面提供ー種AC狀態(tài)機(jī)的構(gòu)建裝置,包括設(shè)定模塊,用于將各搜尋模式中的通配符設(shè)置為特定字符;構(gòu)建模塊,用于根據(jù)所述各搜尋模式構(gòu)建關(guān)鍵字樹,所述關(guān)鍵字樹包括各狀態(tài)節(jié)點(diǎn)、各狀態(tài)節(jié)點(diǎn)的goto函數(shù)表和output函數(shù)表,其中,將基于所述特定字符所轉(zhuǎn)移至的狀態(tài)節(jié)點(diǎn)視為通配符節(jié)點(diǎn);復(fù)制模塊,用于將所述通配符節(jié)點(diǎn)的goto函數(shù)表復(fù)制到兄弟狀態(tài)節(jié)點(diǎn)中,并記錄轉(zhuǎn)移至所述兄弟狀態(tài)節(jié)點(diǎn)的輸入字符為待排除字符,其中,所述兄弟狀態(tài)節(jié)點(diǎn)為與所述通配符節(jié)點(diǎn)具有同一上層狀態(tài)節(jié)點(diǎn)的狀態(tài)節(jié)點(diǎn);識(shí)別模塊,用于當(dāng)識(shí)別到復(fù)制goto函數(shù)表與兄弟狀態(tài)節(jié)點(diǎn)的原有g(shù)oto函數(shù)表存在不確定goto函數(shù)時(shí),將復(fù)制goto函數(shù)表中的不確定goto函數(shù)視為新goto函數(shù),原有g(shù)oto函數(shù)表中的不確定goto函數(shù)視為舊goto函數(shù),并將新goto函數(shù)輸出值所對(duì)應(yīng)的狀態(tài)節(jié)點(diǎn)的goto函數(shù)表復(fù)制到舊goto函數(shù)輸出值所對(duì)應(yīng)的狀態(tài)節(jié)點(diǎn)的goto函數(shù)表中,去除新goto函數(shù),并返回執(zhí)行上述識(shí)別步驟,直至未識(shí)別到不確定goto函數(shù)為止;排除模塊,用于將所述特定字符轉(zhuǎn)換為所述通配符,并從所述通配符中排除所述兄弟狀態(tài)節(jié)點(diǎn)對(duì)應(yīng)的所有待排除字符。
根據(jù)本發(fā)明的AC狀態(tài)機(jī)的構(gòu)建方法及裝置,以使AC狀態(tài)機(jī)能夠處理含有通配符的搜尋模式。
圖IA 圖IC為現(xiàn)有技術(shù)中AC狀態(tài)機(jī)的構(gòu)建方法;圖2A為本發(fā)明一實(shí)施例的AC狀態(tài)機(jī)的構(gòu)建方法的流程示意圖;圖2B 圖2D為本發(fā)明ー實(shí)施例的AC狀態(tài)機(jī)的構(gòu)建方法中的關(guān)鍵字樹的構(gòu)建圖;圖3A 3F為本發(fā)明另ー實(shí)施例的AC狀態(tài)機(jī)的構(gòu)建方法中的關(guān)鍵字樹的構(gòu)建圖;圖4為本發(fā)明另ー實(shí)施例的AC狀態(tài)機(jī)的構(gòu)建裝置的結(jié)構(gòu)示意圖;圖5為本發(fā)明另ー實(shí)施例的AC狀態(tài)機(jī)的構(gòu)建裝置的結(jié)構(gòu)示意圖。
具體實(shí)施例方式實(shí)施例一本實(shí)施例提供ー種AC狀態(tài)機(jī)的構(gòu)建方法。該方法適用于AC狀態(tài)機(jī)的構(gòu)建裝置,該AC狀態(tài)機(jī)的構(gòu)建裝置通過將通配符看做是特定字符構(gòu)造標(biāo)準(zhǔn)的goto函數(shù)表和output函數(shù)表,并對(duì)含有基于通配符所轉(zhuǎn)移至的狀態(tài)節(jié)點(diǎn)進(jìn)行拆分和合井,以消除不確定的goto函數(shù),同時(shí)修改output函數(shù)表,最終構(gòu)造出能夠處理通配符的AC狀態(tài)機(jī)。如圖2A所示,為本實(shí)施例的AC狀態(tài)機(jī)的構(gòu)建方法的流程示意圖。該AC狀態(tài)機(jī)的構(gòu)建方法包括步驟201,將各搜尋模式中的各通配符設(shè)置為特定字符。本步驟的特定字符可以由非ASCII碼值的數(shù)值表示,例如數(shù)值257、258,可以根據(jù)實(shí)際需要進(jìn)行確定。實(shí)際上通配符本身就代表256個(gè)ASCII碼值,這里僅是為了區(qū)分其與ASCII碼值而將通配符設(shè)定為非ASCII碼值的特定字符。這里的搜尋模式中的通配符的個(gè)數(shù)可以為I個(gè)或多個(gè)。而各搜尋模式中的除各通配符之外的確定字符可以由ASCII碼值的數(shù)值表示。步驟202,根據(jù)各搜尋模式構(gòu)建關(guān)鍵字樹,關(guān)鍵字樹包括各狀態(tài)節(jié)點(diǎn)、各狀態(tài)節(jié)點(diǎn)的goto函數(shù)表和output函數(shù)表,其中,將基于特定字符所轉(zhuǎn)移至的狀態(tài)節(jié)點(diǎn)視為通配符節(jié)點(diǎn)。步驟203,將通配符節(jié)點(diǎn)的goto函數(shù)表復(fù)制到兄弟狀態(tài)節(jié)點(diǎn)中,并記錄轉(zhuǎn)移至兄弟狀態(tài)節(jié)點(diǎn)的輸入字符為待排除字符,其中,兄弟狀態(tài)節(jié)點(diǎn)為與通配符節(jié)點(diǎn)具有同一上層狀態(tài)節(jié)點(diǎn)的狀態(tài)節(jié)點(diǎn)。這里的goto函數(shù)表為每個(gè)狀態(tài)節(jié)點(diǎn)所對(duì)應(yīng)的goto函數(shù)的集合。步驟204,當(dāng)識(shí)別到復(fù)制goto函數(shù)表與兄弟狀態(tài)節(jié)點(diǎn)的原有g(shù)oto函數(shù)表存在不確定goto函數(shù)時(shí),將復(fù)制goto函數(shù)表中的不確定goto函數(shù)視為新goto函數(shù),原有g(shù)oto函數(shù)表中的不確定goto函數(shù)視為舊goto函數(shù)。步驟205,將新goto函數(shù)輸出值所對(duì)應(yīng)的狀態(tài)節(jié)點(diǎn)的goto函數(shù)表復(fù)制到舊goto函數(shù)輸出值所對(duì)應(yīng)的狀態(tài)節(jié)點(diǎn)的goto函數(shù)表中,去除新goto函數(shù),并返回執(zhí)行上述識(shí)別步驟,直至未識(shí)別到不確定goto函數(shù)為止。步驟206,將特定字符轉(zhuǎn)換為通配符,并從通配符中排除兄弟狀態(tài)節(jié)點(diǎn)對(duì)應(yīng)的所有待排除字符。在步驟206之后,可以按照現(xiàn)有技術(shù)中的去failure算法構(gòu)建最終的AC狀態(tài)機(jī),即在步驟206之后,還包括根據(jù)關(guān)鍵字樹和去failure算法構(gòu)建AC狀態(tài)機(jī)。根據(jù)本實(shí)施例的AC狀態(tài)機(jī)的構(gòu)建方法,通過將通配符設(shè)定為特定函數(shù),并通過拆分和復(fù)制goto函數(shù)表,構(gòu)造出了能夠處理通配符的AC狀態(tài)機(jī),増加了 AC狀態(tài)機(jī)的適用范圍。實(shí)施例ニ本實(shí)施例對(duì)上述實(shí)施例的AC狀態(tài)機(jī)的構(gòu)建方法做進(jìn)ー步補(bǔ)充說明。本實(shí)施例的AC狀態(tài)機(jī)的構(gòu)建方法在步驟203后且在步驟204之前,還包括識(shí)別 復(fù)制goto函數(shù)表與兄弟狀態(tài)節(jié)點(diǎn)的原有g(shù)oto函數(shù)表存在不確定goto函數(shù)。該識(shí)別復(fù)制goto函數(shù)表與兄弟狀態(tài)節(jié)點(diǎn)的原有g(shù)oto函數(shù)表存在不確定goto函數(shù)包括識(shí)別復(fù)制goto函數(shù)表與兄弟狀態(tài)節(jié)點(diǎn)的原有g(shù)oto函數(shù)表的各轉(zhuǎn)移函數(shù)表達(dá)式和轉(zhuǎn)移函數(shù)輸出值;將轉(zhuǎn)移函數(shù)表達(dá)式相同,且轉(zhuǎn)移函數(shù)輸出值不同的轉(zhuǎn)移函數(shù)作為不確定goto函數(shù)。本實(shí)施例的AC狀態(tài)機(jī)的構(gòu)建方法,通過識(shí)別goto狀態(tài)表中的不確定goto函數(shù),進(jìn)而對(duì)該不確定goto函數(shù)進(jìn)行處理,能夠最大程度保證所構(gòu)造的AC狀態(tài)機(jī)的準(zhǔn)確性。實(shí)施例三本實(shí)施例對(duì)上述實(shí)施例的AC狀態(tài)機(jī)的構(gòu)建方法做進(jìn)ー步限定。本實(shí)施例中,在將新goto函數(shù)輸出值所對(duì)應(yīng)的狀態(tài)節(jié)點(diǎn)的goto函數(shù)表復(fù)制到舊goto函數(shù)輸出值所對(duì)應(yīng)的狀態(tài)節(jié)點(diǎn)的goto函數(shù)表中,去除新goto函數(shù)之后,且在返回執(zhí)行上述識(shí)別步驟,直至未識(shí)別到不確定goto函數(shù)為止之前,還包括判斷新goto函數(shù)輸出值所對(duì)應(yīng)的狀態(tài)節(jié)點(diǎn)是否為終狀態(tài)節(jié)點(diǎn),當(dāng)判斷結(jié)果為是時(shí),將新goto函數(shù)輸出值所對(duì)應(yīng)的狀態(tài)節(jié)點(diǎn)的output函數(shù)表復(fù)制到舊goto函數(shù)輸出值所對(duì)應(yīng)的狀態(tài)節(jié)點(diǎn)的output函數(shù)表中,終狀態(tài)節(jié)點(diǎn)為各搜尋模式中最后ー個(gè)輸入字符對(duì)應(yīng)的狀態(tài)節(jié)點(diǎn)。本實(shí)施例的其它步驟均與實(shí)施例一中一致,在此不再贅述。本實(shí)施例中,通過將終狀態(tài)節(jié)點(diǎn)的output函數(shù)表進(jìn)行復(fù)制,能夠保證最終構(gòu)建的AC狀態(tài)機(jī)在進(jìn)行搜索時(shí)的完整性,不會(huì)因?yàn)槟承顟B(tài)節(jié)點(diǎn)的output函數(shù)不完整而漏掉某些內(nèi)容。實(shí)施例四下面以具體實(shí)例來描述AC狀態(tài)機(jī)的構(gòu)建方法,本實(shí)施例中的搜尋模式集合為{ao、abb、a b、a bg、acoc}。首先,將搜尋模式中的通配符“?”設(shè)置為特定字符,例如,可以將其看做是數(shù)值256,正常的ASCII碼值的范圍為0 255。可選地,還可以是各搜尋模式中的字符由ASCII碼值表示,特定字符由非ASCII碼值的數(shù)值表示。特定字符的設(shè)定可以根據(jù)實(shí)際需要自行設(shè)定。對(duì)于搜尋■模式集合{ab、abb、a b、a bg、acbc},其構(gòu)造出來的第一臨時(shí)關(guān)鍵字樹如圖2B所示。該第一臨時(shí)關(guān)鍵字樹中的每個(gè)終狀態(tài)節(jié)點(diǎn)對(duì)應(yīng)的輸出值如表2所示,即該第一臨時(shí)關(guān)鍵字樹中姆個(gè)狀態(tài)節(jié)點(diǎn)所對(duì)應(yīng)的output函數(shù)表如表2所示。這里的終狀態(tài)節(jié)點(diǎn)指的是基于各搜尋模式最后ー個(gè)字符所轉(zhuǎn)移至的狀態(tài)節(jié)點(diǎn)。本實(shí)施例中,圖2B中的狀態(tài)節(jié)點(diǎn)2、狀態(tài)節(jié)點(diǎn)3、狀態(tài)節(jié)點(diǎn)5、狀態(tài)節(jié)點(diǎn)10和狀態(tài)節(jié)點(diǎn)11即為終狀態(tài)節(jié)點(diǎn)。另外,狀態(tài)節(jié)點(diǎn)4視為通配符節(jié)點(diǎn)。表權(quán)利要求
1.ー種AC狀態(tài)機(jī)的構(gòu)建方法,其特征在于,包括 將各搜尋模式中的各通配符設(shè)置為特定字符; 根據(jù)所述各搜尋模式構(gòu)建關(guān)鍵字樹,所述關(guān)鍵字樹包括各狀態(tài)節(jié)點(diǎn)、各狀態(tài)節(jié)點(diǎn)的goto函數(shù)表和output函數(shù)表,其中,將基于所述特定字符所轉(zhuǎn)移至的狀態(tài)節(jié)點(diǎn)視為通配符節(jié)點(diǎn); 將所述通配符節(jié)點(diǎn)的goto函數(shù)表復(fù)制到兄弟狀態(tài)節(jié)點(diǎn)中,并記錄轉(zhuǎn)移至所述兄弟狀態(tài)節(jié)點(diǎn)的輸入字符為待排除字符,其中,所述兄弟狀態(tài)節(jié)點(diǎn)為與所述通配符節(jié)點(diǎn)具有同一上層狀態(tài)節(jié)點(diǎn)的狀態(tài)節(jié)點(diǎn); 當(dāng)識(shí)別到復(fù)制goto函數(shù)表與兄弟狀態(tài)節(jié)點(diǎn)的原有g(shù)oto函數(shù)表存在不確定goto函數(shù)時(shí),將復(fù)制goto函數(shù)表中的不確定goto函數(shù)視為新goto函數(shù),原有g(shù)oto函數(shù)表中的不確定goto函數(shù)視為舊goto函數(shù); 將新goto函數(shù)輸出值所對(duì)應(yīng)的狀態(tài)節(jié)點(diǎn)的goto函數(shù)表復(fù)制到舊goto函數(shù)輸出值所對(duì)應(yīng)的狀態(tài)節(jié)點(diǎn)的goto函數(shù)表中,去除新goto函數(shù),并返回執(zhí)行上述識(shí)別步驟,直至未識(shí)別到不確定goto函數(shù)為止; 將所述特定字符轉(zhuǎn)換為所述通配符,并從所述通配符中排除所述兄弟狀態(tài)節(jié)點(diǎn)對(duì)應(yīng)的所有待排除字符。
2.根據(jù)權(quán)利要求I所述的AC狀態(tài)機(jī)的構(gòu)建方法,其特征在于,各搜尋模式中的確定字符由ASCII碼值表示,所述特定字符由非ASCII碼值的數(shù)值表示。
3.根據(jù)權(quán)利要求I或2所述的AC狀態(tài)機(jī)的構(gòu)建方法,其特征在于,識(shí)別復(fù)制goto函數(shù)與兄弟狀態(tài)節(jié)點(diǎn)的原有g(shù)oto函數(shù)存在不確定goto函數(shù)包括 識(shí)別復(fù)制goto函數(shù)與兄弟狀態(tài)節(jié)點(diǎn)的原有g(shù)oto函數(shù)的各轉(zhuǎn)移函數(shù)表達(dá)式和轉(zhuǎn)移函數(shù)輸出值; 將轉(zhuǎn)移函數(shù)表達(dá)式相同,且轉(zhuǎn)移函數(shù)輸出值不同的轉(zhuǎn)移函數(shù)作為不確定goto函數(shù)。
4.根據(jù)權(quán)利要求I所述的AC狀態(tài)機(jī)的構(gòu)建方法,其特征在于,所述通配符為?。
5.根據(jù)權(quán)利要求4所述的AC狀態(tài)機(jī)的構(gòu)建方法,其特征在于,所述搜尋模式中所述通配符的個(gè)數(shù)為I個(gè)或多個(gè)。
6.根據(jù)權(quán)利要求I所述的AC狀態(tài)機(jī)的構(gòu)建方法,其特征在干,所述將新goto函數(shù)輸出值所對(duì)應(yīng)的狀態(tài)節(jié)點(diǎn)的goto函數(shù)表復(fù)制到舊goto函數(shù)輸出值所對(duì)應(yīng)的狀態(tài)節(jié)點(diǎn)的goto函數(shù)表中,去除新goto函數(shù)之后,且在返回執(zhí)行上述識(shí)別步驟,直至未識(shí)別到不確定goto函數(shù)為止之前,還包括 判斷所述新goto函數(shù)輸出值所對(duì)應(yīng)的狀態(tài)節(jié)點(diǎn)是否為終狀態(tài)節(jié)點(diǎn),當(dāng)判斷結(jié)果為是時(shí),將所述新goto函數(shù)輸出值所對(duì)應(yīng)的狀態(tài)節(jié)點(diǎn)的output函數(shù)表復(fù)制到舊goto函數(shù)輸出值所對(duì)應(yīng)的狀態(tài)節(jié)點(diǎn)的output函數(shù)表中,所述終狀態(tài)節(jié)點(diǎn)為所述各搜尋模式中最后ー個(gè)輸入字符對(duì)應(yīng)的狀態(tài)節(jié)點(diǎn)。
7.根據(jù)權(quán)利要求I所述的AC狀態(tài)機(jī)的構(gòu)建方法,其特征在于,在所述排除所述兄弟狀態(tài)節(jié)點(diǎn)對(duì)應(yīng)的所有待排除字符之后,還包括 根據(jù)所述關(guān)鍵字樹和去failure算法構(gòu)建AC狀態(tài)機(jī)。
8.—種AC狀態(tài)機(jī)的構(gòu)建裝置,其特征在于,包括 設(shè)定模塊,用于將各搜尋模式中的通配符設(shè)置為特定字符;構(gòu)建模塊,用于根據(jù)所述各搜尋模式構(gòu)建關(guān)鍵字樹,所述關(guān)鍵字樹包括各狀態(tài)節(jié)點(diǎn)、各狀態(tài)節(jié)點(diǎn)的goto函數(shù)表和output函數(shù)表,其中,將基于所述特定字符所轉(zhuǎn)移至的狀態(tài)節(jié)點(diǎn)視為通配符節(jié)點(diǎn); 復(fù)制模塊,用于將所述通配符節(jié)點(diǎn)的goto函數(shù)表復(fù)制到兄弟狀態(tài)節(jié)點(diǎn)中,并記錄轉(zhuǎn)移至所述兄弟狀態(tài)節(jié)點(diǎn)的輸入字符為待排除字符,其中,所述兄弟狀態(tài)節(jié)點(diǎn)為與所述通配符節(jié)點(diǎn)具有同一上層狀態(tài)節(jié)點(diǎn)的狀態(tài)節(jié)點(diǎn); 識(shí)別模塊,用于當(dāng)識(shí)別到復(fù)制goto函數(shù)表與兄弟狀態(tài)節(jié)點(diǎn)的原有g(shù)oto函數(shù)表存在不確定goto函數(shù)時(shí),將復(fù)制goto函數(shù)表中的不確定goto函數(shù)視為新goto函數(shù),原有g(shù)oto函數(shù)表中的不確定goto函數(shù)視為舊goto函數(shù),并將新goto函數(shù)輸出值所對(duì)應(yīng)的狀態(tài)節(jié)點(diǎn)的goto函數(shù)表復(fù)制到舊goto函數(shù)輸出值所對(duì)應(yīng)的狀態(tài)節(jié)點(diǎn)的goto函數(shù)表中,去除新goto函數(shù),并返回執(zhí)行上述識(shí)別步驟,直至未識(shí)別到不確定goto函數(shù)為止; 排除模塊,用于將所述特定字符轉(zhuǎn)換為所述通配符,并從所述通配符中排除所述兄弟狀態(tài)節(jié)點(diǎn)對(duì)應(yīng)的所有待排除字符。
9.根據(jù)權(quán)利要求8所述的AC狀態(tài)機(jī)的構(gòu)建裝置,其特征在于,各搜尋模式中的確定字符由ASCII碼值表示,所述特定字符由非ASCII碼值的數(shù)值表示。
10.根據(jù)權(quán)利要求8或9所述的AC狀態(tài)機(jī)的構(gòu)建裝置,其特征在于,還包括 識(shí)別不確定函數(shù)模塊,用于識(shí)別復(fù)制goto函數(shù)與兄弟狀態(tài)節(jié)點(diǎn)的原有g(shù)oto函數(shù)的各轉(zhuǎn)移函數(shù)表達(dá)式和轉(zhuǎn)移函數(shù)輸出值,將轉(zhuǎn)移函數(shù)表達(dá)式相同,且轉(zhuǎn)移函數(shù)輸出值不同的轉(zhuǎn)移函數(shù)作為不確定goto函數(shù),并將識(shí)別結(jié)果發(fā)送至所述識(shí)別模塊。
11.根據(jù)權(quán)利要求8所述的AC狀態(tài)機(jī)的構(gòu)建裝置,其特征在于,所述通配符為?。
12.根據(jù)權(quán)利要求11所述的AC狀態(tài)機(jī)的構(gòu)建裝置,其特征在于,所述搜尋模式中所述通配符的個(gè)數(shù)為I個(gè)或多個(gè)。
13.根據(jù)權(quán)利要求8所述的AC狀態(tài)機(jī)的構(gòu)建裝置,其特征在于,還包括 識(shí)別終狀態(tài)節(jié)點(diǎn)模塊,用于判斷所述新goto函數(shù)輸出值所對(duì)應(yīng)的狀態(tài)節(jié)點(diǎn)是否為終狀態(tài)節(jié)點(diǎn),當(dāng)判斷結(jié)果為是時(shí),將所述新goto函數(shù)輸出值所對(duì)應(yīng)的狀態(tài)節(jié)點(diǎn)的output函數(shù)表復(fù)制到舊goto函數(shù)輸出值所對(duì)應(yīng)的狀態(tài)節(jié)點(diǎn)的output函數(shù)表中,所述終狀態(tài)節(jié)點(diǎn)為所述各搜尋模式中最后ー個(gè)輸入字符對(duì)應(yīng)的狀態(tài)節(jié)點(diǎn)。
14.根據(jù)權(quán)利要求8所述的AC狀態(tài)機(jī)的構(gòu)建裝置,其特征在于,還包括 構(gòu)建AC狀態(tài)機(jī)模塊,用于根據(jù)所述關(guān)鍵字樹和去failure算法構(gòu)建AC狀態(tài)機(jī)。
全文摘要
本發(fā)明提供一種AC狀態(tài)機(jī)的構(gòu)建方法及裝置,方法包括將各搜尋模式中的各通配符設(shè)置為特定字符;根據(jù)各搜尋模式構(gòu)建關(guān)鍵字樹;將通配符節(jié)點(diǎn)的goto函數(shù)表復(fù)制到兄弟狀態(tài)節(jié)點(diǎn)中,并記錄轉(zhuǎn)移至兄弟狀態(tài)節(jié)點(diǎn)的輸入字符為待排除字符;當(dāng)識(shí)別到存在不確定goto函數(shù)時(shí),對(duì)不確定goto函數(shù)進(jìn)行處理以消除不確定goto函數(shù),直至未識(shí)別到不確定goto函數(shù)為止;從通配符中排除兄弟狀態(tài)節(jié)點(diǎn)對(duì)應(yīng)的所有待排除字符。根據(jù)本發(fā)明的AC狀態(tài)機(jī)的構(gòu)建方法及裝置,使AC狀態(tài)機(jī)能夠處理通配符。
文檔編號(hào)G06F17/30GK102646115SQ20121003806
公開日2012年8月22日 申請(qǐng)日期2012年2月17日 優(yōu)先權(quán)日2012年2月17日
發(fā)明者陳國(guó)鵬 申請(qǐng)人:北京星網(wǎng)銳捷網(wǎng)絡(luò)技術(shù)有限公司