欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種基于有限狀態(tài)自動機的字符串匹配方法及裝置的制作方法

文檔序號:6579980閱讀:473來源:國知局

專利名稱::一種基于有限狀態(tài)自動機的字符串匹配方法及裝置的制作方法
技術領域
:本發(fā)明涉及檢索
技術領域
,尤指一種基于有限狀態(tài)自動機(DeterministicFiniteStateAutomaton,DFA)的字符串匹配方法及裝置。
背景技術
:Aho-Corasick算法于1975年由貝爾實驗室的Aho和Corasick在《EfficientStringMatching:AnAidtoBibliographicSearch》中提出,其核心是一個涵蓋所有查詢關4建字的有卩艮4犬態(tài)自動才幾(DeterministicFiniteStateAutomaton,DFA)。待搜索的數(shù)據(jù)庫中的每個字符逐個輸入到DFA中,當某個查詢關鍵字命中,DFA輸出報告。通過Aho-Corasick算法得到DFA的過程中,需要構造三個函數(shù)GOTO,FAILURE和OUTPUT。構造這三個函數(shù)的流程包括1.1構造GOTO函數(shù)。該過程需要輸入的是要查詢的關鍵字集合。例如輸入的關鍵字集合是K={yl,y2,,yk}。輸出的是GOTO函數(shù)和部分完成的OUTPUT函數(shù)。1.2構造FAILURE函數(shù)該過程需要輸入的是上述過程1.1中得到的GOTO函數(shù)及部分完成的OUTPUT函數(shù)。輸出的是FAILURE函數(shù)和完成的OUTPUT函數(shù)。1.3構造OUTPUT函數(shù)。該過程將GOTO函數(shù)和FAILURE函數(shù)進一步合并,得到DFA。所以該過程輸入的是上述過程U中得到的GOTO函數(shù)及過程1.2中得到的FAILURE函凄t。輸出的是構造完成的DFA。DFA中包含了在當前狀態(tài)、輸入字符后所對應的各種可能的下一狀態(tài)。以及各個狀態(tài)和命中的關鍵字的對應關系。當命中某一關4定字時,能夠及時的輸出命中結果。應用DFA進行字符匹配時,待搜索數(shù)據(jù)庫中的每個字符在DFA中能夠觸發(fā)一次且僅能夠觸發(fā)一次狀態(tài)轉(zhuǎn)換。所以,Aho-Corasick的算法應用的優(yōu)勢在于其算法復雜度僅與待搜索數(shù)據(jù)庫的長度有關,而與查詢關鍵字的長度及數(shù)目都無關。因此,在字符串匹配的各種已有算法中,Aho-Corasick是迄今為止最快的算法。在實際應用過程中,DFA通常以一維數(shù)組的形式存放在系統(tǒng)主內(nèi)存中。雖然系統(tǒng)在運行過程中,CPU會把在最近幾個時間段內(nèi)經(jīng)常訪問的內(nèi)容存入高速緩存(Cache);高速緩存即高速緩沖存儲器,位于CPU和主存儲器DRAM(主內(nèi)存)之間的存儲容量較小但速度很高的存儲器。但由于高速緩存容量有限,DFA與系統(tǒng)中其他頻繁訪問CPU的數(shù)據(jù)之間存在竟爭關系,不能保證訪問頻度高的部分(或全部)DFA總能駐留在一級數(shù)據(jù)緩存中,當不在緩存中時則必須到內(nèi)存中去獲取。所以當使用DFA搜索數(shù)據(jù)庫或者過濾網(wǎng)絡數(shù)據(jù)流時,最壞情況下,可能會出現(xiàn)每輸入一個字節(jié),則必須訪問一次主內(nèi)存,才能得到下一個狀態(tài)。而訪問主內(nèi)存來獲取下一個狀態(tài)會造成很大的時延,導致字符匹配過程的時延很長,嚴重影響了匹配的速度和效率。因此,頻繁的主內(nèi)存訪問已經(jīng)成為基于DFA搜索的系統(tǒng)整體性能的瓶頸。
發(fā)明內(nèi)容本發(fā)明實施例提供一種基于有限狀態(tài)自動機的字符串匹配方法及裝置,解決現(xiàn)有技術中存在的字符匹配速度慢、時延長的問題。一種基于有限狀態(tài)自動機的字符串匹配方法,包括確定用戶輸入的關4建字在設定的關鍵字組中時,調(diào)用所述關4建字組對應的有限狀態(tài)自動機DFA程序代碼;所述程序代碼為根據(jù)采用Aho-Corasick算法針對所述關鍵字組確定的當前狀態(tài)、輸入字符和輸出狀態(tài)的對應關系預先生成的;執(zhí)行所述程序代碼,依次輸入待搜索數(shù)據(jù)庫中包含的字符,并根據(jù)當前狀態(tài)和輸入字符,確定輸出狀態(tài);所述輸出狀態(tài)即為下次輸入字符時的當前狀態(tài);根據(jù)所述輸出狀態(tài)輸出字符匹配結果。本發(fā)明的上述方法,還包括根據(jù)程序代碼的允許大小,選取所述DFA中包含的與初始狀態(tài)具有衍生關系的部分狀態(tài),所選取的部分狀態(tài)的出現(xiàn)頻率之和大于設定的閾值;生成僅包含以選取的部分狀態(tài)作為當前狀態(tài)時,輸入字符后所對應的輸出狀態(tài)的程序代碼。根據(jù)本發(fā)明的上述方法,所述程序代碼僅包含以選取的部分狀態(tài)作為當前狀態(tài),輸入字符后所對應的輸出狀態(tài)時;其余未被選取的狀態(tài)作為當前狀態(tài)時,輸入字符后所對應的輸出狀態(tài)仍從系統(tǒng)主內(nèi)存中獲取。根據(jù)本發(fā)明的上述方法,所述根據(jù)所述輸出狀態(tài)輸出字符匹配結果,具體包括根據(jù)采用Aho-Comsick算法得到的各輸出狀態(tài)所對應的字符匹配結果的對應關系,查詢所述輸出狀態(tài)所對應的字符匹配結果;當確定所述字符匹配結果為某個關鍵字命中時,輸出字符匹配結果;否則無輸出。根據(jù)本發(fā)明的上述方法,所述設定的關鍵字組根據(jù)設定時間段內(nèi)的關鍵字使用情況的統(tǒng)計結果定期更新;相應的,根據(jù)更新后的關鍵字組,生成對應的DFA程序代碼。一種基于有限狀態(tài)自動機的字符串匹配裝置,包括生成模塊,用于采用Aho-Comsick算法針對選定的關鍵字組確定當前狀態(tài)、輸入字符和輸出狀態(tài)的對應關系,并才艮據(jù)所述對應關系預先生成有限狀態(tài)自動機DFA程序代碼;調(diào)用^t塊,用于確定用戶輸入的關鍵字在所述關^t字組中,調(diào)用所述生成模塊生成的與所述關鍵字組對應的DFA程序代碼;執(zhí)行模塊,用于執(zhí)行所述程序代碼,依次輸入待搜索數(shù)據(jù)庫中包含的字符,并根據(jù)當前狀態(tài)和輸入字符,確定輸出狀態(tài);所述輸出狀態(tài)即為下次輸入字符時的當前狀態(tài);輸出模塊,用于根據(jù)所述輸出狀態(tài)輸出字符匹配結果。本發(fā)明的上述裝置,還包括選取模塊,用于才艮據(jù)程序代碼的允許大小,選取所述DFA中包含的與初始狀態(tài)具有衍生關系的部分狀態(tài),所選取的部分狀態(tài)的出現(xiàn)頻率之和大于設定的閾值;所述生成模塊,具體用于生成僅包含以選取的部分狀態(tài)作為當前狀態(tài)時,輸入字符后所對應的輸出狀態(tài)的程序代碼。沖艮據(jù)本發(fā)明的上述裝置,所述執(zhí)行模塊,還用于當所述生成模塊所生成的程序代碼中僅包含以選取的部分狀態(tài)作為當前狀態(tài)時,輸入字符后所對應的輸出狀態(tài)時,從系統(tǒng)主內(nèi)存中獲取未被選取的狀態(tài)作為當前狀態(tài)時,輸入字符后所對應的輸出狀態(tài)。根據(jù)本發(fā)明的上述裝置,所述輸出模塊,具體包括查詢單元,用于根據(jù)采用Aho-Corasick算法得到的各輸出狀態(tài)所對應的字符匹配結果的對應關系,查詢所述輸出狀態(tài)所對應的字符匹配結果;輸出單元,用于當確定所述字符匹配結果為某個關4建字命中時,輸出字符匹配結果;否則無輸出。本發(fā)明的上述裝置,還包括更新模塊,用于根據(jù)設定時間段內(nèi)的關鍵字使用情況的統(tǒng)計結果定期更新所述設定的關鍵字組;相應的,所述生成模塊,還用于根據(jù)更新后的關鍵字組,生成對應的DFA程序代碼。一種內(nèi)容過濾設備,在該內(nèi)容過濾設備中設置上述的基于有限狀態(tài)自動機的字符串匹配裝置。確定用戶輸入的關鍵字在設定的關鍵字組中時,調(diào)用所述關鍵字組對應的有限狀態(tài)自動機DFA程序代碼;所述程序代碼為根據(jù)采用Aho-Corasick算法針對所述關鍵字組確定的當前狀態(tài)、輸入字符和輸出狀態(tài)的對應關系預先生成的;執(zhí)行所述程序代碼,依次輸入待搜索數(shù)據(jù)庫中包含的字符,并根據(jù)當前狀態(tài)和輸入字符,確定輸出狀態(tài);所述輸出狀態(tài)即為下次輸入字符時的當前狀態(tài);根據(jù)所述輸出狀態(tài)輸出字符匹配結果。將采用Aho-Corasick算法針對所述關鍵字組得到的DFA采用程序代碼的形式存放,在需要進行字符匹配時,能夠確保待執(zhí)行的程序存在于一級指令緩存中,而不必再去訪問系統(tǒng)內(nèi)存,減少了系統(tǒng)處理時延,提高了字符匹配的速度和效率圖1為本發(fā)明實施例中基于有限狀態(tài)自動機的字符串匹配方法的流程圖;圖2為本發(fā)明實施例中字符串匹配裝置的結構示意圖。具體實施例方式由于目前所有主流處理器大都具有一級緩存和二級緩存,少數(shù)高端處理器還集成了三級緩存。其中,一級緩存是封閉在CPU芯片內(nèi)部的高速緩存,其存取速度與CPU主頻一致。一級緩存中可以暫時存儲CPU運算時的即將使用的各類運算操作指令和運算所需的數(shù)據(jù),以便向CPU遞送。即一級緩存包括一級指令緩存和一級數(shù)據(jù)緩存。二級緩存是一級緩存的緩沖器,在CPU外部,其作用就是存儲CPU處理時需要用到的、一級緩存又無法存儲的數(shù)據(jù)。同理,三級緩存和內(nèi)存可以看作是二級緩存的緩沖器。二級緩存、三級緩存和內(nèi)存都不能存儲CPU操作指令。而一次一級緩存訪問的時延開銷是一次主內(nèi)存訪問的十分之一,甚至幾十分之一。所以,一級緩存越大,可以暫存的數(shù)據(jù)越多,CPU的運算速度也可以越快?;谏鲜銮闆r,本申請實施例提供一種基于有限狀態(tài)自動機的字符串匹配方法,將采用Aho-Corasick算法得到DFA編譯為程序代碼存放,當需要時可以直接調(diào)用。由于待執(zhí)行的程序代碼可以被預讀到一級緩存中(具體為預讀到一級指令緩存中),從而實現(xiàn)有效減少時延的目的。該方法流程如圖1所示,執(zhí)行步驟如下步驟S101:根據(jù)確定出的關鍵字組,采用Aho-Corasick算法確定當前狀態(tài)、輸入字符和輸出狀態(tài)的對應關系,以及輸出狀態(tài)與命中結果的對應關系。根據(jù)設定時間段內(nèi)的關鍵字使用情況的統(tǒng)計結果確定關鍵字組,關鍵字組中一般可以包括該短時間內(nèi)搜索頻率比較高的關鍵字。采用Aho-Corasick算法對設定的關鍵字組進行運算,得到針對該關鍵字組的對應關系表,其中包括在當前狀態(tài)下輸入各個字符,所分別對應的輸出狀態(tài)。以及各輸出狀態(tài)所對應的字符匹配結果(即輸出結果)。例如確定出的關鍵字組包括HE,SHE,HIS和HERS四個關鍵字。則在
背景技術
中所述的過程1.1中輸入K-(HE,SHE,HIS,HERS},經(jīng)過步驟1.1、1.2、1.3的構建過程,得到輸入前狀態(tài)(即當前狀態(tài))、輸入字符與對應輸出的輸出狀態(tài)的對應關系如表1所示。表1<table>tableseeoriginaldocumentpage10</column></row><table><table>tableseeoriginaldocumentpage11</column></row><table>各輸出狀態(tài)所對應的字符匹配結果如表2所示'<table>tableseeoriginaldocumentpage11</column></row><table>2HE命中5SHE,HE命中7HIS命中9HERS命中其他狀態(tài)無命中也就是說,當對待搜索數(shù)據(jù)庫中的每個字符逐一輸入該DFA時,按照上述表l中包含的對應關系,得到輸入字符和當前狀態(tài)所對應的下一狀態(tài)(輸出狀態(tài))。當輸入某個字符后,得到的下一狀態(tài)對應的是命中某一關鍵字時,則如表2所示,輸出字符匹配結果,其他狀態(tài)則無輸出。以上述表l為例。如果以一維數(shù)組形式存放在系統(tǒng)主內(nèi)存,可以按各當前狀態(tài)的狀態(tài)序號的大小順序存放。當DFA的狀態(tài)總數(shù)不超過256時,狀態(tài)序號也就不會大于255(即DFA中任一狀態(tài)的狀態(tài)序號均可使用一個字節(jié)來存放);同時每個狀態(tài)對應的下一狀態(tài)(即每個當前狀態(tài)所對應的輸出狀態(tài))不會超過255個,所以每個狀態(tài)占用256(ASCII字符表的字符總數(shù))個字節(jié)即可,其中該狀態(tài)的序號存放在該狀態(tài)所占用的第0個字節(jié)中,所對應的下一狀態(tài)依次存放在所占用的第0-255字節(jié)中。則在每個狀態(tài)(當前狀態(tài))下,當輸入字符N(十進制值)時所對應的下一狀態(tài)(輸出狀態(tài))存儲在從起始位置之后的第N(0=<N<=255)個字節(jié)中。假設當前狀態(tài)X所占用的第M、N個字節(jié)的值分別為A和B,而其他字節(jié)的值為0;表示當DFA的當前狀態(tài)為X時;輸入M,跳轉(zhuǎn)到狀態(tài)A;輸入N,跳轉(zhuǎn)到狀態(tài)B,輸入其他字節(jié)跳轉(zhuǎn)到初始狀態(tài)0。以狀態(tài)0為例,在其占用的256個字節(jié)中,第72字節(jié)的值為1,表示輸入H(H字符的十進制值是72),DFA從狀態(tài)"0",進入狀態(tài)"1";第83字節(jié)的值為3,表示輸入S(S字符的十進制值是83),DFA從狀態(tài)"0",進入狀態(tài)"3";其余字節(jié)的值均為0,表示輸入其他字符,DFA維持"0"狀態(tài)不變。如果有限狀態(tài)自動機的狀態(tài)總數(shù)不超過256,那么如上所述每個狀態(tài)在內(nèi)存腫占用的存《諸空間就是256個字節(jié);當狀態(tài)總數(shù)超過256,假設是300,那么存儲一個狀態(tài)的序號就需要兩個字節(jié),這種情況下,每個狀態(tài)占用的字節(jié)數(shù)則為256x2。f支^L系統(tǒng)內(nèi)存中用于存儲有限狀態(tài)自動機的起始地址是ADD,當在狀態(tài)Z下llT入字符M(對應數(shù)值77)時,對應的跳轉(zhuǎn)目的狀態(tài)就可以從ADD[Zx(256*2)十77]這個地址處獲取。有限狀態(tài)自動機在系統(tǒng)初始化在內(nèi)存后,在系統(tǒng)運行過程中是不變的。把構造出來的有限狀態(tài)自動機應用于網(wǎng)絡報文過濾,每個網(wǎng)絡報文流當前在有限狀態(tài)自動機中所處的狀態(tài)是分別記錄的,每輸入一個字符,從ADD[當前狀態(tài)x(256*2)+輸入字符數(shù)值]地址處即可以獲得跳轉(zhuǎn)目的狀態(tài)。假設DFA當前狀態(tài)為X,輸入字符的十進制值為N,該DFA—維數(shù)組在系統(tǒng)主內(nèi)存的存》t^始地址為DFA一ADDR,則在當前狀態(tài)X下輸入字符N后的下一狀態(tài)為》也iitDFA—ADDR[X*256+N]處的值。步驟S102-.沖艮^^居上述確定出的當前狀態(tài)、輸入字符和輸出狀態(tài)的對應關系,預先生成對應的DFA程序代碼。由于采用一維數(shù)組的形式存放DFA在實際應用過程中會嚴重影響字符匹配的速度和效率,所以本申請中將采用Aho-Corasick算法確定出的、針對選定的關鍵字組的當前狀態(tài)、輸入字符和輸出狀態(tài)的對應關系進行編譯,得到對應的DFA程序代石馬,并以程序代碼的形式存放。得到DFA考呈序代碼具體可以包括下列兩種情況(1)根據(jù)上述確定出的針對選定關鍵字組的所有當前狀態(tài)、輸入字符和輸出狀態(tài)的對應關系,生成包含所有對應關系的DFA程序代碼,并存放。(2)根據(jù)禾呈序代碼的允許大小,選取上述步驟S101中確定出的DFA中包含的與初始狀態(tài)具有衍生關系的部分狀態(tài),所選取的部分狀態(tài)的出現(xiàn)頻率之和大于設定的閾d直;即只生成包含部分狀態(tài)對應關系的DFA程序代碼。生成的DFA程序代碼中僅包含以選取的部分狀態(tài)作為當前狀態(tài)時,輸入字符后所對應的輸出狀態(tài)。此時,其余未^皮選取的狀態(tài)作為當前狀態(tài)時,輸入字符后所對應的輸出狀態(tài)仍從系統(tǒng)主內(nèi)存中獲取。由于以程序代碼形式存放DFA的前提條件是程序代碼所占用的存儲空間不能超過系統(tǒng)指令空間的大小,因此由于系統(tǒng)指令空間的限制,則可以只選取出現(xiàn)頻度較高的幾個關聯(lián)狀態(tài)編譯進程序代碼,其他狀態(tài)仍然從系統(tǒng)主內(nèi)存讀取,即如情況(2)所述的做法,以避免所生成的DFA程序代碼過大。沿用上述例子,仍以表l所示的DFA為例,在實際字符匹配應用過程中,包括進行文本檢索或網(wǎng)絡數(shù)據(jù)流過濾等。該DFA在大部分情況下處于初始狀態(tài)"0",只有當出現(xiàn)'H,或'S,字符,才觸發(fā)DFA進入狀態(tài)"1"或"3"。其出現(xiàn)頻度最最高的是狀態(tài)"0",狀態(tài)'T,和狀態(tài)"3";其次,狀態(tài)"2"和狀態(tài)"6"再次;所以可只選取狀態(tài)"0"、狀態(tài)"1"和狀態(tài)"3"(狀態(tài)"7"、"9"與狀態(tài)"3"重合)生成對應的DFA程序代碼并存放。假設采用的美國信息交換標準代碼(AmericanStandardCodeforInformationInterchange,ASCII)字符總數(shù)為256。如表1所示的,DFA初始狀態(tài)為0。在進行字符匹配輸入的過程中,除了H和S外,其他ASCII字符輸入都不會觸發(fā)DFA改變狀態(tài);也就是說,在整個處理過程中,狀態(tài)"0"的存在概率為(256-2)/256;出現(xiàn)狀態(tài)T且后續(xù)狀態(tài)為"0"、T、"3"三個狀態(tài)之一(即以狀態(tài)"1"為當前狀態(tài)時,輸入字符后出現(xiàn)狀態(tài)"0"、T、"3"的概率)的概率為1/256*(256-2)/256;出現(xiàn)狀態(tài)"3"且后續(xù)狀態(tài)為"0"、T、"3"狀態(tài)之一(即以狀態(tài)"3"為當前狀態(tài)時,輸入字符后出現(xiàn)狀態(tài)"0"、"1"、"3"的概率)的概率為1/256*(256-1)/256。也就是說,只選取輸入狀態(tài)為"0"、"1"、"3",生成程序代碼并存放以供調(diào)用,就足以保證99.7%以上的字符輸入處理不必訪問系統(tǒng)主內(nèi)存。只有剩余不到0.3%的系統(tǒng)主內(nèi)存訪問概率,而且也不一定要訪問,因此對系統(tǒng)整體能的影響也是微乎其微的。例如生成的DFA的程序代碼(例如類C代/馬)可以如下:switch(當前狀態(tài)){case0:switch(輸入字符){caseH:下一狀態(tài)=1;goto—done;caseS:下一狀態(tài)=3;goto—done;default:下一狀態(tài)=0;goto—done;case1:switch(輸入字符){caseE):下一狀態(tài)caseI:H:caseS:default:goto—done;下一狀態(tài)=goto—done;下一狀態(tài)=goto—done;下一狀態(tài)=goto—done;下一狀態(tài)=goto—donej2;6;1;0;case3cas6了case9switch(輸入字符){caseH:下一狀態(tài)=goto—done;4;caseS:下一狀態(tài)=3;goto—done;default:下一狀態(tài)=0;goto—done;Default:下一狀態(tài)=DFA—ADDR[當前狀態(tài)*256+輸入字符的十進制值];Goto_done;done:上述以程序代碼的形式存放DFA的實現(xiàn)方式,在統(tǒng)計出的關鍵字組發(fā)生更改(包括增加、減少、替換等)時,都需要重新生成新的DFA程序代碼,其靈活性相對降低,但能夠大大提高了系統(tǒng)性能。由于長期的統(tǒng)計規(guī)律中,常用關鍵字組成的關鍵字組一般比較恒定,因此,使用該方式能夠滿足極高的過濾速度的需求。也就是說,上述步驟SIOI、S102為預處理步驟,生成程序代碼的過程并不需要每次進行字符匹配時都執(zhí)行一次,只需要定期更新即可,即在更新關鍵字組后更新。而關^l建字組一艮據(jù)統(tǒng)計結果確定。當需要進行字符匹配時,執(zhí)行下面的步驟步驟S103:確定用戶輸入的關鍵字在設定的關鍵字組中時,調(diào)用該關鍵字組對應的DFA程序代碼。當用戶需要進行搜索時,會輸入其要搜索的關鍵字。若用戶輸入的關鍵字屬于設定的關鍵字組中的關鍵字,則會調(diào)用對應的DFA程序代碼。沿用上邊的例子,調(diào)用上述給出的類C程序代碼。由于在系統(tǒng)程序運行過程中,一般程序代碼的執(zhí)行會將當前執(zhí)行的程序代碼的臨近代碼,即將執(zhí)行的后續(xù)程序代碼預讀到一級指令緩存中。本發(fā)明實施例中存放的包含訪問概率較高的部分狀態(tài)的DFA程序代碼或包含全部狀態(tài)的程序代碼,在調(diào)用和執(zhí)行程序時,其即將執(zhí)行的部分可以被預讀取到一級指令緩存中;因此,有效的保證了每次字符輸入時所需要執(zhí)行的程序均存在于一級緩存中,從而避免了訪問主內(nèi)存,消除了訪問主內(nèi)存的時延。步驟S104:執(zhí)行調(diào)用的程序代碼,依次輸入待搜索數(shù)據(jù)庫中包含的字符,并根據(jù)當前狀態(tài)和輸入字符,確定輸出狀態(tài)。其中,輸出狀態(tài)即為下次輸入字符時的當前狀態(tài)。調(diào)用程序代碼后,在執(zhí)行程序的過程中,會將待搜索數(shù)據(jù)庫中的所以字符逐一遍歷,并在每次輸入一個字符后,跳轉(zhuǎn)到相應的l命出狀態(tài),并以該狀態(tài)為繼續(xù)執(zhí)行該狀態(tài)對應的的程序語句。當某此輸出結果對應某個關4定字命中時,輸出字符匹配結果,否則可以不輸出任何信息。沿用上邊的例子,調(diào)用上述存儲的程序代碼后,DFA初始狀態(tài)(即當前狀態(tài))為狀態(tài)"0";若輸入'H,字符,則DFA改變?yōu)闋顟B(tài)"1";若輸入為'S,字符,則改變?yōu)闋顟B(tài)"3";若輸入其他字符,則仍保持狀態(tài)"0"不變。當DFA改變?yōu)闋顟B(tài)"1"(即當前狀態(tài)為狀態(tài)"1")后,若繼續(xù)輸入的字符為E,則DFA改變?yōu)闋顟B(tài)"2"。例如當待搜索的數(shù)據(jù)庫中包含有字符串"SHISHE,,時,則這六個字符將按順序逐個輸入DFA中。DFA的初始狀態(tài)為狀態(tài)"0",輸入字符'S,后,DFA的狀態(tài)改變?yōu)闋顟B(tài)"3";輸入字符'H,后,DFA的狀態(tài)改變?yōu)闋顟B(tài)"4";輸入字符T后,DFA的狀態(tài)改變?yōu)闋顟B(tài)"6";輸入字符'S'后,DFA的狀態(tài)改變?yōu)闋顟B(tài)"7",并輸出"fflS命中,,;接著輸入字符'H,,使DFA的狀態(tài)改變?yōu)闋顟B(tài)"4";再輸入字符'E,,使DFA的狀態(tài)改變?yōu)闋顟B(tài)"5",并輸出"SHE,HE命中"。步驟S105:根據(jù)輸出狀態(tài)輸出字符匹配結果。沿用上邊的例子,當輸出狀態(tài)為狀態(tài)"2",將輸出狀態(tài)"2"所對應的輸出結果"HE命中"輸出。同理,當輸出狀態(tài)為狀態(tài)"7",將輸出狀態(tài)"7"所對應的輸出結果"HIS命中"輸出;當輸出狀態(tài)為狀態(tài)"5",將輸出狀態(tài)"5"所對應的輸出結果"SHE,HE命中"輸出。較佳的,在實際應用過程中,可以定期的設定時間段內(nèi)的關鍵字使用情況的統(tǒng)計結果更新設定的關鍵字組,相應的,在更新關鍵字組后,重新生成當前狀態(tài)、輸入字符與輸出狀態(tài)的對應關系,以及輸出狀態(tài)與字符匹配結果的對應關系,并對應更新DFA程序代碼。使得DFA能夠更有效地搜索到最常用的關鍵字。以構建一種基于有限狀態(tài)自動機的字符串匹配裝置。如圖2所示,包括生成模塊IO、調(diào)用模塊20、執(zhí)行模塊30和輸出模塊40。生成模塊10,用于采用Aho-Corasick算法針對選定的關鍵字組確定當前狀態(tài)、輸入字符和輸出狀態(tài)的對應關系,并根據(jù)確定出的對應關系預先生成有限狀態(tài)自動機DFA程序代碼。調(diào)用模塊20,用于確定用戶輸入的關鍵字在上述選定的關4走字組中,調(diào)用生成模塊10生成的與該關4定字組對應的DFA程序代碼。執(zhí)行模塊30,用于執(zhí)行調(diào)用模塊20調(diào)用的程序代碼,依次輸入待搜索數(shù)據(jù)庫中包含的字符,并根據(jù)當前狀態(tài)和輸入字符,確定輸出狀態(tài);其中,輸出狀態(tài)即為下次輸入字符時的當前狀態(tài)。輸出模塊40,用于根據(jù)執(zhí)行模塊30確定出的輸出狀態(tài)輸出字符匹配結果。較佳的,上述輸出模塊40,進一步還可以包括查詢單元401和輸出單元402。查詢單元401,用于根據(jù)根據(jù)采用Aho-Corasick算法得到的各輸出狀態(tài)所對應的字符匹配結果的對應關系,查詢執(zhí)行單元30確定出的輸出狀態(tài)所對應的字符匹配結果。輸出單元402,用于當確定查詢單元401查詢到的字符匹配結果為某個關鍵字命中時,輸出字符匹配結果;否則無輸出。上述基于有限狀態(tài)自動機的字符串匹配裝置,還包括選取^t塊50,用于根據(jù)程序代碼的允許大小,選取生成的DFA中包含的與初始狀態(tài)具有衍生關系的部分狀態(tài),所選取的部分狀態(tài)的出現(xiàn)頻率之和大于設定的閾值;。相應的,生成模塊10,具體用于根據(jù)確定模塊50選取的部分狀態(tài)生成DFA程序代碼,其中僅包含以選取的部分狀態(tài)作為當前狀態(tài)時,輸入字符后所對應的輸出狀態(tài)。上述執(zhí)行模塊30,還用于當生成模塊IO所生成的程序代碼中僅包含以選取的部分狀態(tài)作為當前狀態(tài)時,輸入字符后所對應的輸出狀態(tài)時,從系統(tǒng)主內(nèi)存中獲取未被選取的狀態(tài)作為當前狀態(tài)時,輸入字符后所對應的輸出狀態(tài)。上述基于有限狀態(tài)自動機的字符串匹配裝置,還包括更新模塊60,用于根據(jù)設定時間段內(nèi)的關鍵字使用情況的統(tǒng)計結果定期更新設定的關鍵字組。相應的,生成模塊10,還用于根據(jù)更新后的關鍵字組,生成對應的DFA程序代碼。本發(fā)明實施例還提供了一種內(nèi)容過濾設備,所述內(nèi)容過濾設備中設置有上述基于有限狀態(tài)自動機的字符串匹配裝置,該內(nèi)容過濾設備可以是具有內(nèi)容過濾功能的路由器、交換機、網(wǎng)關或防火墻等等。通過將采用Aho-Corasick算法針對所述關鍵字組得到的DFA采用程序代碼的形式存放,在需要進行字符匹配時,能夠確保待執(zhí)行的程序存在于一級指令緩存中,即CPU總是能夠在一級指令緩存中獲取到將要執(zhí)行的部分或全部的DFA,而不必再去訪問系統(tǒng)內(nèi)存,消除了以一維數(shù)組形式在系統(tǒng)主內(nèi)存中存放DFA時,由于頻繁訪問主內(nèi)存的時延很大所帶來的系統(tǒng)性能瓶頸,減少了系統(tǒng)處理時延,提高了字符匹配的速度和效率。本申請的上述技術方案將Aho-Corasick算法在文本檢索、字符串匹配和網(wǎng)絡數(shù)據(jù)流過濾等領域?qū)嶋H應用時的處理能力,尤其是處理速度,提高了一個數(shù)量級。由于當前的主流處理器都釆用系統(tǒng)主存輔以多級緩存的架構,因此,本申請的技術方案具有普遍適用性。以上所述,僅為本發(fā)明較佳的具體實施方式,但本發(fā)明的保護范圍并不局限于此,任何熟悉本
技術領域
的技術人員在本發(fā)明揭露的技術范圍內(nèi),可輕易想到的變化、替換或應用到其他類似的裝置,都應涵蓋在本發(fā)明的保護范圍之內(nèi)。因此,本發(fā)明的保護范圍應該以權利要求書的保護范圍為準。權利要求1、一種基于有限狀態(tài)自動機的字符串匹配方法,其特征在于,包括確定用戶輸入的關鍵字在設定的關鍵字組中時,調(diào)用所述關鍵字組對應的有限狀態(tài)自動機DFA程序代碼;所述程序代碼為根據(jù)采用Aho-Corasick算法針對所述關鍵字組確定的當前狀態(tài)、輸入字符和輸出狀態(tài)的對應關系預先生成的;執(zhí)行所述程序代碼,依次輸入待搜索數(shù)據(jù)庫中包含的字符,并根據(jù)當前狀態(tài)和輸入字符,確定輸出狀態(tài);所述輸出狀態(tài)即為下次輸入字符時的當前狀態(tài);根據(jù)所述輸出狀態(tài)輸出字符匹配結果。2、如權利要求1所述的方法,其特征在于,還包括根據(jù)程序代碼的允許大小,選取所述DFA中包含的與初始狀態(tài)具有衍生關系的部分狀態(tài),所選取的部分狀態(tài)的出現(xiàn)頻率之和大于設定的閾值;生成僅包含以選取的部分狀態(tài)作為當前狀態(tài)時,輸入字符后所對應的輸出狀態(tài)的程序代碼。3、如權利要求2所述的方法,其特征在于,所述程序代碼僅包含以選取的部分狀態(tài)作為當前狀態(tài),輸入字符后所對應的輸出狀態(tài)時;其余未被選取的狀態(tài)作為當前狀態(tài)時,輸入字符后所對應的輸出狀態(tài)仍從系統(tǒng)主內(nèi)存中獲取。4、如權利要求1所述的方法,其特征在于,所述根據(jù)所述輸出狀態(tài)輸出字符匹配結果,具體包括根據(jù)采用Aho-Corasick算法得到的各輸出狀態(tài)所對應的字符匹配結果的對應關系,查詢所述^T出狀態(tài)所對應的字符匹配結果;當確定所述字符匹配結果為某個關鍵字命中時,輸出字符匹配結果;否則無輸出。5、如權利要求1-4任一所述的方法,其特征在于,所述設定的關4建字組根據(jù)設定時間段內(nèi)的關鍵字使用情況的統(tǒng)計結果定期更新;相應的,根據(jù)更新后的關鍵字組,生成對應的DFA程序代碼。6、一種基于有限狀態(tài)自動機的字符串匹配裝置,其特征在于,包括生成才莫塊,用于采用Aho-Corasick算法針對選定的關4定字組確定當前狀態(tài)、輸入字符和輸出狀態(tài)的對應關系,并才艮據(jù)所述對應關系預先生成有限狀態(tài)自動機DFA程序^碼;調(diào)用模塊,用于確定用戶輸入的關鍵字在所述關鍵字組中,調(diào)用所述生成才莫塊生成的與所述關4建字組對應的DFA程序代碼;執(zhí)行模塊,用于執(zhí)行所述程序代碼,依次輸入待搜索數(shù)據(jù)庫中包含的字符,并根據(jù)當前狀態(tài)和輸入字符,確定輸出狀態(tài);所述輸出狀態(tài)即為下次輸入字符時的當前狀態(tài);輸出模塊,用于根據(jù)所述輸出狀態(tài)輸出字符匹配結果。7、如權利要求6所述的裝置,其特征在于,還包括選取模塊,用于根據(jù)程序代碼的允許大小,選取所述DFA中包含的與初始狀態(tài)具有衍生關系的部分狀態(tài),所選取的部分狀態(tài)的出現(xiàn)頻率之和大于設定的閾值;所述生成模塊,具體用于生成僅包含以選取的部分狀態(tài)作為當前狀態(tài)時,輸入字符后所對應的輸出狀態(tài)的程序代碼。8、如權利要求7所述的裝置,其特征在于,所述執(zhí)行才莫塊,還用于當所述生成模塊所生成的程序代碼中僅包含以選取的部分狀態(tài)作為當前狀態(tài)時,輸入字符后所對應的輸出狀態(tài)時,從系統(tǒng)主內(nèi)存中獲取未被選取的狀態(tài)作為當前狀態(tài)時,輸入字符后所對應的輸出狀態(tài)。9、如權利要求6所述的裝置,其特征在于,所述輸出模塊,具體包括查詢單元,用于根據(jù)采用Aho-Corasick算法得到的各輸出狀態(tài)所對應的字符匹配結果的對應關系,查詢所述輸出狀態(tài)所對應的字符匹配結果;輸出單元,用于當確定所述字符匹配結果為某個關鍵字命中時,輸出字符匹配結果;否則無iTlr出。10、如權利要求6-9任一所述的裝置,其特征在于,還包括更新模塊,用于根據(jù)設定時間段內(nèi)的關鍵字使用情況的統(tǒng)計結果定期更新所述設定的關鍵字組;相應的,所述生成模塊,還用于根據(jù)更新后的關鍵字組,生成對應的DFA程序代碼。11、一種內(nèi)容過濾設備,其特征在于,在該內(nèi)容過濾設備中設置如權利要求6-10任一所述的基于有限狀態(tài)自動機的字符串匹配裝置。全文摘要本發(fā)明公開了一種基于有限狀態(tài)自動機的字符串匹配方法及裝置,該方法包括確定用戶輸入的關鍵字在設定的關鍵字組中時,調(diào)用所述關鍵字組對應的有限狀態(tài)自動機DFA程序代碼;所述程序代碼為根據(jù)采用Aho-Corasick算法針對所述關鍵字組確定的當前狀態(tài)、輸入字符和輸出狀態(tài)的對應關系預先生成的;執(zhí)行所述程序代碼,依次輸入待搜索數(shù)據(jù)庫中包含的字符,并根據(jù)當前狀態(tài)和輸入字符,確定輸出狀態(tài);所述輸出狀態(tài)即為下次輸入字符時的當前狀態(tài);根據(jù)所述輸出狀態(tài)輸出字符匹配結果。上述方法,采用程序代碼的形式存放DFA,減少了系統(tǒng)處理時延,提高了字符匹配的速度和效率。文檔編號G06F17/30GK101639861SQ20091016729公開日2010年2月3日申請日期2009年9月2日優(yōu)先權日2009年9月2日發(fā)明者黃凱明申請人:福建星網(wǎng)銳捷網(wǎng)絡有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
琼中| 江都市| 界首市| 佛冈县| 南漳县| 绥中县| 美姑县| 华蓥市| 白城市| 保康县| 尉氏县| 鲁山县| 龙门县| 湘阴县| 四川省| 罗田县| 麻城市| 焦作市| 沧州市| 靖远县| 太白县| 奉新县| 大余县| 黔西| 松滋市| 明光市| 玛沁县| 山东省| 龙山县| 广汉市| 和硕县| 中西区| 克拉玛依市| 南丹县| 南召县| 合肥市| 呼图壁县| 永兴县| 于田县| 怀宁县| 滨州市|