303、中央處理器將前綴狀態(tài)自動機存儲在存儲器中。
[0082] 具體的,可通過以下方法實現(xiàn):
[0083] 中央處理器將生成的前綴狀態(tài)自動機采用稀疏矩陣的方式存儲在存儲器中,該處 理器可以為內存或全局顯存,稀疏矩陣中的第一列表示前綴狀態(tài)自動機中的各個狀態(tài),稀 疏矩陣中的第一行表示前綴狀態(tài)自動機的各個輸入,其中的數(shù)字表示在該數(shù)字所在行所示 的狀態(tài)下檢測到該數(shù)字所在列的輸入時,狀態(tài)跳轉的下一跳狀態(tài),-1表示在該行所示的狀 態(tài)下檢測到該數(shù)字所在列的輸入時,有字符串被成功匹配;
[0084] 對于成功匹配到了哪個字符串,則是由另外一個匹配列表進行存儲,以上述前綴 狀態(tài)自動機為例,該列表中包括前綴狀態(tài)自動機的每一個狀態(tài)以及與每一個狀態(tài)對應的地 址,若其中第一狀態(tài)對應的地址不為空,則表示在該第一狀態(tài)下有模式字符串的前綴被成 功匹配,該第一狀態(tài)對應的地址為被成功匹配到的模式字符串的前綴的存儲地址。
[0085] 示例性的,如上述前綴狀態(tài)自動機采用的稀疏矩陣可以表示為下表1所示的內 容:
[0086]
[0088] 表 1
[0089] 前綴狀態(tài)自動機的匹配列表可以表示為下表2所示的內容:
[0090]
[0091] 表 2
[0092] 圖5所示的后綴狀態(tài)自動機采用的稀疏矩陣可以表示為下表3所示的內容:
[0093]
[0094]
[0095] 表 3
[0096] 圖5所示的后綴狀態(tài)自動機的匹配列表可以表示為下表4所示的內容:
[0097]
[0098] 表 4
[0099] 圖6所示的后綴狀態(tài)自動機采用的稀疏矩陣可以表示為下表5所示的內容:
[0100]
[0101] 表 5
[0102] 圖6所示的后綴狀態(tài)自動機的匹配列表可以表示為下表6所示的內容:
[0103]
[0104] 表 6
[0105] S304、圖形處理器獲取前綴狀態(tài)自動機并對待匹配字符串進行匹配。
[0106] 具體的,可通過以下方法實現(xiàn):
[0107] 圖形處理器從上述存儲器中獲取上述前綴狀態(tài)自動機,該獲取過程可以通過零 拷貝技術從存儲器中讀取該前綴狀態(tài)自動機,而后可以從網(wǎng)卡獲取待匹配字符串,并可以 將該待匹配字符串進行分段,為每個分段開啟一個線程利用多模式字符串匹配算法對待匹 配字符串進行字符串匹配,該匹配所使用的程序若是在OpenCL架構下進行,則可以使用 OpenCL的C語言根據(jù)多模式字符串匹配算法的原理編寫而成的一段適合圖形處理器運行 的程序。
[0108] 示例性的,當圖形處理器獲取到的待匹配字符串為XXX~XXXABACCCCCXXX~XXX, 假設XXX~XXX為32個字節(jié),圖形處理器可以將接收到的待匹配字符串分段可以為從首字 符開始每32+4個字符分為一段,由于上述模式字符串的前綴的長度預設為4個字符,則每 相鄰的兩段的重疊區(qū)域為4個字符,圖形處理器從存儲器中獲取上述如圖4所示的前綴狀 態(tài)自動機,為每一段分配一個線程利用上述前綴狀態(tài)自動機對待匹配字符串進行字符匹配 上述分段如圖7所示,重疊區(qū)域表示線程1與線程2處理的待匹配字符串的相同位置的字 符,該匹配過程可以為從上述前綴狀態(tài)自動機的起始狀態(tài)開始,由第一個線程從待匹配字 符串的首字符開始逐個字符得輸入到該前綴狀態(tài)自動機中,直到該線程將該分段內的所有 字符都輸入到該前綴狀態(tài)自動機中為止,如表1所示,在起始狀態(tài)〇時,當前32個字符X進 行輸入時都失敗跳轉到起始狀態(tài)〇,當輸入字符A時前綴狀態(tài)自動機從狀態(tài)0跳轉到狀態(tài) 1,當繼續(xù)輸入字符B時,跳轉到狀態(tài)2,繼續(xù)輸入字符A時跳轉到狀態(tài)3,最后輸入字符C時, 跳轉到狀態(tài)4,此時,圖形處理器從該稀疏矩陣中讀取到數(shù)值-1,即表示在該狀態(tài)下有前綴 被成功匹配,而后圖形處理器經過查找上述列表2中的匹配鏈表,從該匹配鏈表中得到匹 配的字符串的地址,從而通過該地址查找到匹配成功的字符串為ABAC,并生成匹配結果,并 將該匹配結果發(fā)送到中央處理器可讀取的內存中,該匹配結果表示前綴字符串ABAC被成 功匹配,并且指示該字符串ABAC在待匹配字符串中的位置;
[0109] 圖形處理器開啟第二個線程從上述待匹配字符串的第33個字符A開始利用上述 前綴狀態(tài)自動機按照相同方法向后逐個輸入32+4個字符,為了防止漏檢,第一個線程和第 二個線程所輸入的待匹配字符串中相同位置的字符數(shù)量為4個,即是前綴字符串的字符長 度,按照上述字符匹配過程,圖形處理器開啟η個線程對待匹配字符串進行匹配,直到待匹 配字符串中所有字符都被輸入到上述前綴狀態(tài)自動機中。
[0110] 需要說明的是,上述所有線程可以并行工作,即所有線程可以同時利用上述前綴 狀態(tài)自動機將各自處理的字符輸入到該自動機中并生成對應的處理結果。
[0111] S305、中央處理器獲取后綴狀態(tài)自動機并對待匹配字符串進行匹配。
[0112] 具體的,可以通過以下方法實現(xiàn):
[0113] 當中央處理器從內存中讀取圖形處理器存儲的匹配結果,若判斷出有前綴字符串 被成功匹配,則從該內存中查找到匹配成功的前綴在待匹配字符串中的位置,并在待匹配 字符串中被成功匹配的前綴字符串的最后一個字符開始向后開始逐個將待匹配字符串中 的子符輸入到后綴狀態(tài)自動機中。
[0114] 示例性的,當中央處理器從內存中讀取到圖形處理在待匹配字符串XXX~ XXXABACCCCCXXX~XXX中成功匹配到了前綴字符串ABAC,并且位置為待匹配字符串的第33 個字符到第36個字符,則找到該位置,并從待匹配字符串的第37個字符開始將待匹配字符 串中的字符逐個輸入到后綴狀態(tài)自動機,如表3所示,狀態(tài)0'表示當前輸入字符為C (因為 后綴字符串CCCC和DDD對應的前綴為ABAC,這里可以取前綴的最后一個字符C作為初始狀 態(tài)…),當輸入上述待匹配字符串的第37個字符C時,則從起始狀態(tài)0'開始,跳轉到狀 態(tài)P,繼續(xù)輸入C時跳轉到狀態(tài)2',再次輸入字符C時跳轉到狀態(tài)3',最后再輸入字符 C時,跳轉到狀態(tài)4',通過表3可知此時中央處理器讀取到數(shù)值-1即表示有后綴字符串被 成功匹配,而后中央處理器經過查找上述列表4中的匹配鏈表,從該匹配鏈表中得到匹配 的字符串的地址,從而通過該地址查找到匹配成功的字符串為CCCC,而后繼續(xù)輸入字符X, 此時匹配結束跳轉到狀態(tài)0,直到待匹配字符串的最后一個字符被輸入到后綴狀態(tài)自動機 中,此時中央處理器可確定在待匹配字符串中有前綴ABAC和后綴CCCC被成功匹配,即有模 式字符串ABACCCCC在待匹配字符串中被成功匹配;
[0115] 假設當中央處理器從內存中讀取到圖形處理在待匹配字符串XXX~ XXXWXYZAAAAAXXX~XXX中成功匹配到了前綴字符串WXYZ,并且位置為待匹配字符串的第 33個字符到第36個字符,則找到該位置,并從待匹配字符串的第37個字符開始將待匹配字 符串中的字符逐個輸入到后綴狀態(tài)自動機,如表5所示,狀態(tài)0"表示當前輸入字符為Z (因 為后綴字符串AAAAA對應的前綴為WXYZ,這里可以取前綴的最后一個字符Z作為初始狀態(tài) 〇〃),當輸入上述待匹配字符串的第37個字符A時,則從起始狀態(tài)0〃開始,跳轉到狀態(tài)1〃, 繼續(xù)輸入A時跳轉到狀態(tài)2",再次輸入字符A時跳轉到狀態(tài)3",最后再輸入字符A時,跳轉 到狀態(tài)4〃,最后再輸入字符A時,跳轉到狀態(tài)5〃,通過表5可知此時中央處理器讀取到數(shù) 值-1即表示有后綴字符串被成功匹配,而后中央處理器經過查找上述列表6中的匹配鏈 表,從該匹配鏈表中得到匹配的字符串的地址,從而通過該地址查找到匹配成功的字符串 為AAAAA,而后繼續(xù)輸入字符X,此時匹配結束跳轉到狀態(tài)0",直到待匹配字符串的最后一 個字符被輸入到后綴狀態(tài)自動機中,此時中央處理器可確定在待匹配字符串中有前綴WXYZ 和后綴AAAAA被成功匹配,即有模式字符串WXYZAAAAA在待匹配字符串中被成功匹配。
[0116] 需要說明的是,中央處理器從內存中讀取圖形處理器的匹配結果并對待匹配字符 串進行字符匹配的操作可以和圖形處理器并行運行。
[0117] 本發(fā)明的實施例提供一種字符串匹配方法,首先中央處理器將模式字符串分為前 綴和后綴,并分別生成前綴狀態(tài)自動機和后綴狀態(tài)自動機,圖形處理器利用前綴狀態(tài)自動 機對待匹配字符串進行字符串匹配,匹配成功后,由中央處理器利用后綴狀態(tài)自動機對待 匹配字符串進行第二次字符串匹配,能夠使得字符串匹配的效率更高。
[0118] 本發(fā)明實施例提供一種字符串匹配裝置01,如圖8所示,該裝置01包括:
[0119] 自動機獲取單元011,用于獲取前綴狀態(tài)自動機,前綴狀態(tài)自動機是由模式字符串 的前綴按照多模式字符串匹配算法構成的狀態(tài)自動機,模式字符串為字符串匹配時所用的 特征字符串,前綴由從模式字符串第一個字符開始逐個提取預設值個數(shù)的字符組合而成;
[0120] 匹配單元012,用于從自動機獲取單元011獲取前綴狀態(tài)自動機,獲取待匹配字符 串,根據(jù)前綴狀態(tài)自動機對待匹配字符串進行字符串匹配,以便字符串匹配成功后中央處 理器利用模式字符串的后綴對待匹配字符串進行第二次字符串匹配。
[0121] 進一步的,自動機獲取單元011具體用于:
[0122] 從存儲器中獲取前綴狀態(tài)自動機,前綴狀態(tài)自動機按照稀疏矩陣的方式存儲在存 儲器內存中,稀疏矩陣中的行表示前綴狀態(tài)自動機的各個狀態(tài),稀疏矩陣每一列對應一個 輸入,稀疏矩陣中的列表示前綴狀態(tài)自動機接收到每一列對應的輸入時狀態(tài)跳轉的下一跳 狀態(tài),其中-1表示在該行所示的狀態(tài)下有字符串被成功