本發明涉及網絡安全技術領域,更具體地,涉及dfa壓縮方法及裝置、正則表達式匹配方法及系統。
背景技術:
基于正則表達式的模式匹配,簡稱正則表達式匹配,是下一代防火墻(nextgenerationfirewall,ngfw)、入侵檢測/防御系統(intrusiondetectionsystems/intrusionpreventionsystem,ids/ips)、統一威脅管理(unifiedthreatmanagement,utm)等安全網關系統的關鍵模塊,而高性能的正則表達式匹配是其核心技術。正則表達式匹配通過檢查和處理tcp/ip協議應用層的網包載荷(payload)對網包(packet)進行監控或者過濾。
正則表達式匹配主要通過確定型有窮自動機(deterministicfiniteautomata,dfa)和非確定型有窮自動機(undeterministicfiniteautomata,nfa)兩種數據結構來實現。其中,nfa內存占用小,但匹配速度極慢,在多核或通用處理器平臺上根本不能滿足實際的網絡處理要求;而dfa匹配速度快,缺點是內存占用過高。復雜的正則表達式集合可能引起dfa的狀態數量膨脹,導致需要巨大的儲存空間。
技術實現要素:
為解決正則表達式匹配中dfa內存占用過高的問題,本發明提供了dfa壓縮方法及裝置、正則表達式匹配方法及系統。
根據本發明的一個方面,提供了一種dfa壓縮方法,包括:
根據正則表達式集合構造dfa,所述dfa包括:字符、狀態和每個狀態各自對應于每個字符的轉移,對應于每個字符,所述轉移從當前狀態指向與該字符相應的一個狀態;
根據所述dfa中的相同轉移對狀態和轉移進行標記,其中所述相同轉移為指向同一狀態的轉移;
根據所述狀態的標記和所述轉移的標記對所述dfa進行壓縮。
具體地,所述根據所述dfa中的相同轉移對狀態和轉移進行標記,包括:
對于所述dfa中的每個狀態,選取該狀態的相同轉移數目最多的轉移標記為該狀態的第一狀態轉移,并將具有相同第一狀態轉移的狀態分組到一個第一狀態集合中;
對于每個所述第一狀態集合,將其中滿足預設條件的一個狀態標記為第一狀態,并將所述第一狀態再次分組到一個第二狀態集合中;其中,若判斷第一狀態轉移的數目最多的狀態只有一個,所述預設條件包括:第一狀態轉移的數目最多,若判斷第一狀態轉移的數目最多的狀態有至少兩個,則所述預設條件包括:在第一狀態轉移的數目最多的前提下,深度最小;
對于所述第一狀態集合中剩余的每個狀態,若判斷該狀態與所述第一狀態對應同一字符有相同轉移的數目大于該狀態的第一狀態轉移的數目,則將該狀態標記為第二狀態;
將所述第二狀態再次分組到所述第一狀態所在的第二狀態集合中,并將所述第二狀態的指向所述第一狀態的轉移標記為第二狀態轉移;
將所述第一狀態集合中沒被再次分組的狀態組合成一個新的第一狀態集合,對所述新的第一狀態集合迭代執行再次分組的步驟,直到所述第一狀態集合中的每個狀態都被再次分組到第二狀態集合中。
具體地,所述根據所述狀態的標記和所述轉移的標記對所述dfa進行壓縮,包括:
對于每個所述第一狀態,保留該第一狀態的一個第一狀態轉移,將該第一狀態的不同于所述第一狀態轉移的轉移標記為第三狀態轉移,并保留所述第三狀態轉移,該第一狀態的其他轉移不保留;
對于每個所述第二狀態,保留該第二狀態的一個第二狀態轉移,將與所述第一狀態對應同一字符的轉移不相同的轉移標記為該第二狀態的第三狀態轉移,并保留所述第三狀態轉移,該第二狀態的其他轉移不保留。
具體地,所述根據所述狀態的標記和所述轉移的標記對所述dfa進行壓縮,還包括:
對于每個狀態的所述第三狀態轉移,若對應于連續的字符存在相同的第三狀態轉移,則對應于該連續的字符僅保留一個第三狀態轉移。
根據本發明的第二方面,提供了一種基于所述dfa壓縮方法的正則表達式匹配方法,包括:
讀取壓縮后的所述dfa的當前狀態和當前輸入字符;
在所述當前狀態的第三狀態轉移中查找對應于所述當前輸入字符的第三狀態轉移;
若判斷存在對應于所述當前輸入字符的第三狀態轉移,則根據該第三狀態轉移將所述當前狀態轉移到下一個狀態;
若判斷不存在對應于所述當前輸入字符的第三狀態轉移,則通過判斷當前狀態為第一狀態或第二狀態,根據當前狀態的第一狀態轉移或第二狀態轉移將當前狀態轉移到下一個狀態。
根據本發明的第三方面,提供了一種dfa壓縮裝置,包括:
構造單元,用于根據正則表達式集合構造dfa,所述dfa包括:字符、狀態和每個狀態各自對應于每個字符的轉移,對應于每個字符,所述轉移從當前狀態指向與該字符相應的一個狀態;
標記單元,用于根據所述dfa中的相同轉移對狀態和轉移進行標記,其中所述相同轉移為指向同一狀態的轉移;
壓縮單元,用于根據所述狀態的標記和所述轉移的標記對所述dfa進行壓縮。
具體地,所述標記單元包括:
第一標記子單元,用于為所述dfa中的每個狀態選取該狀態的相同轉移數目最多的轉移標記為該狀態的第一狀態轉移,并將具有相同第一狀態轉移的狀態分組到一個第一狀態集合中;
第二標記子單元,用于將每個所述第一狀態集合中滿足預設條件的一個狀態標記為第一狀態,并將所述第一狀態再次分組到一個第二狀態集合中;其中,若判斷第一狀態轉移的數目最多的狀態只有一個,所述預設條件包括:第一狀態轉移的數目最多,若判斷第一狀態轉移的數目最多的狀態有至少兩個,則所述預設條件包括:在第一狀態轉移的數目最多的前提下,深度最小;
第三標記子單元,用于判斷所述第一狀態集合中剩余的每個狀態,若該狀態與所述第一狀態對應同一字符有相同轉移的數目大于該狀態的第一狀態轉移的數目,則將該狀態標記為第二狀態;還用于將所述第二狀態再次分組到所述第一狀態所在的第二狀態集合中,并將所述第二狀態的指向所述第一狀態的轉移標記為第二狀態轉移;
迭代子單元,用于將所述第一狀態集合中沒被再次分組的狀態組合成一個新的第一狀態集合,并將所述新的第一狀態集合發送到所述第一標記子單元和第二標記子單元以迭代執行再次分組的步驟,直到所述第一狀態集合中的每個狀態都被再次分組到第二狀態集合中。
具體地,所述壓縮單元具體用于:
對于每個所述第一狀態,保留該第一狀態的一個第一狀態轉移,將該第一狀態的不同于所述第一狀態轉移的轉移標記為第三狀態轉移,并保留所述第三狀態轉移,該第一狀態的其他轉移不保留;
對于每個所述第二狀態,保留該第二狀態的一個第二狀態轉移,將與所述第一狀態對應同一字符的轉移不相同的轉移標記為該第二狀態的第三狀態轉移,并保留所述第三狀態轉移,該第二狀態的其他轉移不保留。
具體地,所述壓縮單元還具體用于:
對于每個狀態的所述第三狀態轉移,若對應于連續的字符存在相同的第三狀態轉移,則對應于該連續的字符僅保留一個第三狀態轉移。
根據本發明的第四方面,提供了一種正則表達式匹配系統,包括所述dfa壓縮裝置以及讀取單元、匹配單元,其中:
讀取單元,用于讀取壓縮后的所述dfa的當前狀態和當前輸入字符;
匹配單元,用于在所述當前狀態的第三狀態轉移中查找對應于所述當前輸入字符的第三狀態轉移;
若判斷存在對應于所述當前輸入字符的第三狀態轉移,則根據該第三狀態轉移將所述當前狀態轉移到下一個狀態;
若判斷不存在對應于所述當前輸入字符的第三狀態轉移,則通過判斷當前狀態為第一狀態或第二狀態,根據當前狀態的第一狀態轉移或第二狀態轉移將當前狀態轉移到下一個狀態。
本發明提供的技術方案通過對dfa中的狀態和狀態的轉移進行標記,根據狀態的標記和轉移的標記對所述dfa進行壓縮,在不影響查找速率的情況下能達到較高的壓縮率,使dfa占用更少內存。
附圖說明
圖1為dfa狀態轉移圖和狀態轉移表;
圖2為又一dfa狀態轉移圖和狀態轉移表;
圖3為本發明實施例提供的dfa壓縮方法流程圖;
圖4為本發明又一實施例提供的dfa壓縮方法流程圖;
圖5為前端dfa壓縮后的效果圖;
圖6為后端dfa壓縮后的效果圖;
圖7為本發明實施例提供的dfa壓縮裝置結構圖;
圖8為本發明又一實施例提供的dfa壓縮裝置結構圖;
圖9為本發明實施例提供的正則表達式匹配系統結構圖。
具體實施方式
下面結合附圖和實施例,對本發明的具體實施方式作進一步詳細描述。以下實施例用于說明本發明,但不用來限制本發明的范圍。
dfa由不同類型的片段構造,如全部由正則表達式拆分得到的字符串片段構造的dfa、全部由錨定的字符串片段或只含單個混沌因子的錨定片段構造的dfa等。其中,混沌因子定義為符號組合“.*”、“[^□]*”、“.+”、“[^□]+”、“.{□}”或“[^□]{□}”。
對于由字符串片段構造的dfa,也稱為前端dfa,片段的語法是串接。如圖1所示,圖1為字符串片段“fil”、“cmd”和“url”對應的dfa狀態轉移圖和狀態轉移表。對于每個串接字符,dfa都會存在對應于所述串接字符的狀態的前向轉移,所述前向轉移從深度低的狀態指向深度高的狀態。除了這些前向轉移之外,其它的轉移基本上都是指向初始狀態或者初始狀態的相鄰狀態的后向轉移,所述后向轉移從深度高的狀態指向深度低的狀態。
例如,圖1所示的dfa狀態轉移表中,表的上方為字符,表的左側為dfa的狀態及狀態對應的深度,如2/1表示狀態2的深度為1,表中的數字表示每個狀態對應于不同字符的轉移指向的狀態。所有的轉移對應于字符‘f’、‘c’和‘u’都會分別指向狀態1、2或3,狀態1、2和3都是狀態0的相鄰狀態。除了前向轉移和指向狀態0的相鄰狀態的轉移,其他轉移都指向狀態0。因此,dfa狀態轉移表中大部分狀態的轉移都是相同的,所述轉移集中指向狀態0、1、2和3。
由錨定的字符串片段或者只含單個混沌因子的錨定片段構造的dfa,也稱為后端dfa。后端dfa中片段的語法中不僅包含串接,而且包含錨定以及混沌因子。如圖2所示,圖2為錨定片段集合“^e=[^&]*\.exe”、“^=[^\n]{6}”、“^=[^\n]{3,5}”和“^\.com”對應的dfa狀態轉移圖和狀態轉移表。其中,錨定會使得所有狀態都含有指向死狀態的轉移,而且對于含有對應串接字符的前向轉移的狀態,錨定使該狀態其余的轉移都指向死狀態。此外,混沌因子“[^□]*”會產生一個中間狀態,所述中間狀態及其后續狀態對于字符集合“[^□]”中的字符幾乎都會指向該中間狀態。而對于混沌因子“[^□]{□}”,它能產生一條狀態鏈,鏈中每個狀態含有的對應于“[^□]”中的字符的前向轉移都指向該狀態在鏈中的相鄰狀態。因為混沌因子都會有一個范圍很大的“[^□]”,所以狀態鏈中各個狀態內的轉移對于大部分字符是相同的,而各個狀態間的轉移對于大部分字符是不同的,只要包含在“[^□]”中就不同。所述狀態內的轉移為對于每個狀態,該狀態的轉移。所述狀態間的轉移為狀態間對應于同一字符的轉移。
例如,圖2中,錨定使得dfa中的所有狀態都含有指向死狀態11的轉移,而且對于狀態10、12、14、17、20、23和28,它們對應于除串接字符以外的其他字符的轉移都指向死狀態11。混沌因子“[^\&]*”產生了中間狀態15,使得狀態15、18、21、24和26對應于除字符‘&’和‘\.’以外的其他字符的非前向轉移都指向中間狀態15。混沌因子“[^\n]{6}”產生了狀態鏈13、16、19、22、25和27,使得這些狀態中與字符‘\n’以外的其他字符所對應的轉移都指向下一個相鄰狀態,即狀態16、19、22、25、27和28。混沌因子“[^\n]{6}”產生的狀態鏈中狀態間的轉移大部分是不同的,如狀態13和16。不同混沌因子“[^\n]{6}”中的狀態和“[^\&]*”的狀態間的轉移大部分也不同,如狀態13和15,而其他情況下狀態間的轉移大部分是相同的,如狀態11和12、狀態15和18。
綜上,對于前端dfa中的每個狀態,存在該狀態對應于每個字符指向初始狀態的轉移,即狀態內的轉移一致性,以及狀態間對應于同一字符一致指向初始狀態以及初始狀態的相鄰狀態的轉移,即狀態間的轉移一致性。而對于后端dfa,串接的字符會帶來狀態內和狀態間一致指向死狀態的轉移,即狀態內和狀態間的轉移一致性;混沌因子“[^□]*”始終會產生中間狀態,并使得串接的字符帶來狀態內一致指向該中間狀態的轉移,即狀態內的轉移一致性,以及狀態間一致指向該中間狀態、該中間狀態的相鄰狀態和死狀態的轉移,即狀態間的轉移一致性;混沌因子“[^□]{□}”始終會產生狀態鏈,并帶來狀態內一致指向狀態鏈中相鄰狀態的轉移,即狀態內的轉移一致性和狀態間的轉移區分性。
以上由于正則表達式的拆分特性使得狀態的大量相同轉移都是冗余的,本發明提出了dfa壓縮方法及裝置、正則表達式匹配方法及系統,最大程度地去除這些冗余的轉移,從而壓縮了正則表達式構造的dfa。但本發明不限于用于對以上兩種dfa片段進行壓縮,對于其他dfa片段中由相同轉移帶來的冗余問題,本發明普遍適用。
下面對dfa進行介紹:
dfa實際上為自動狀態機,由多個狀態、轉移邊和每個狀態的輸入組成。所述狀態用圓圈中的數字表示,所述轉移邊用箭頭表示,所述狀態的輸入用箭頭上的字符表示。dfa的特點是對于每一個狀態,確定的輸入一定有一個確定的輸出。如圖1所示的狀態0下,輸入f一定會轉移到狀態1。使用dfa進行匹配時,先指定狀態集合中的某一個狀態為起始狀態,分析器從起始狀態開始,每讀入一個字符就修改一次狀態,將當前狀態的下一個狀態重置為當前狀態。分析器在讀完所有字符后,會停留在一個確定的狀態,如果這個狀態與期望的狀態一致,則所述分析器接收了所述字符串,否則所述分析器拒絕了所述字符串。
圖3為本發明實施例提供的dfa壓縮方法流程圖,如圖3所示,包括:s1,根據正則表達式集合構造dfa,所述dfa包括:字符、狀態和每個狀態各自對應于每個字符的轉移,對應于每個字符,所述轉移從當前狀態指向與該字符相應的一個狀態;s2,根據所述dfa中的相同轉移對狀態和轉移進行標記,其中所述相同轉移為指向同一狀態的轉移;s3,根據所述狀態的標記和所述轉移的標記對所述dfa進行壓縮。
具體地,s1中的所述正則表達式一般包括表述匹配次數的量詞、表述具體位置的錨點和字符串,用于表示字符串集合的規則。在進行正則表達式匹配之前需要將正則表達式轉換成機器能閱讀的有限自動機。dfa的狀態轉移表是一張二維表,如圖1和圖2所示,包括字符、狀態和每個狀態各自對應于每個字符的轉移。對應于每個字符,所述轉移從當前狀態指向與該字符相應的一個狀態。s2中所述相同轉移為指向同一狀態的轉移,根據所述相同轉移對所述dfa中狀態和轉移進行標記,所述標記用于區分狀態和轉移。s3中根據狀態的標記和轉移的標記對不同狀態的不同轉移進行不同壓縮,所述壓縮為去除相同轉移,從而減少dfa中的數據。
例如,圖1所示的dfa狀態轉移表包括狀態1-9,字符c、d、f、i、l、m、r、u和其他字符,以及狀態0-9各自對應于每個字符的轉移。對應于每個字符,所述轉移從當前狀態指向與該字符相應的一個狀態,如當前狀態為0,對應于字符f,所述轉移從狀態0指向狀態1。圖1所示的dfa狀態轉移表中存在指向狀態0、1、2和3的相同轉移,根據所述相同轉移對所述dfa中狀態和轉移進行標記。
本實施例根據dfa中的相同轉移對dfa中的狀態和轉移進行標記,根據狀態的標記和轉移的標記對所述dfa進行壓縮,去除了dfa中冗余的轉移,使dfa占用更少內存。需要說明的是,對于其他情況下存在的由相同狀態轉移帶來的冗余問題,本實施例也能解決,不限于本實施例所列舉的情況。
圖4為本發明又一實施例提供的dfa壓縮方法流程圖,如圖4所示,在上述實施例的基礎上,本實施例中所述根據所述dfa中的相同轉移對狀態和轉移進行標記,包括:s21,對于所述dfa中的每個狀態,選取該狀態的相同轉移數目最多的轉移標記為該狀態的第一狀態轉移,并將具有相同第一狀態轉移的狀態分組到一個第一狀態集合中;s22,對于每個所述第一狀態集合,將其中滿足預設條件的一個狀態標記為第一狀態,并將所述第一狀態再次分組到一個第二狀態集合中;其中,若判斷第一狀態轉移的數目最多的狀態只有一個,所述預設條件包括:第一狀態轉移的數目最多,若判斷第一狀態轉移的數目最多的狀態有至少兩個,則所述預設條件包括:在第一狀態轉移的數目最多的前提下,深度最小;s23,對于所述第一狀態集合中剩余的每個狀態,若判斷該狀態與所述第一狀態對應同一字符有相同轉移的數目大于該狀態的第一狀態轉移的數目,則將該狀態標記為第二狀態;s24,將所述第二狀態再次分組到所述第一狀態所在的第二狀態集合中,并將所述第二狀態的指向所述第一狀態的轉移標記為第二狀態轉移;s25,將所述第一狀態集合中沒被再次分組的狀態組合成一個新的第一狀態集合,對所述新的第一狀態集合迭代執行再次分組的步驟,直到所述第一狀態集合中的每個狀態都被分組到某一個第二狀態集合中。
具體地,在s21中,所述第一狀態轉移指一個狀態轉移到相同狀態的轉移數目最多的轉移,也可以限定為一個狀態轉移到相同狀態的轉移數目大于預設閾值的轉移。選取狀態的第一狀態轉移后,判斷狀態的第一狀態轉移是否相同,將具有相同第一狀態轉移的狀態分組到一個集合中,所述集合為第一狀態集合。如果一個狀態的第一狀態轉移與其他狀態的第一狀態轉移都不同,則將所述狀態單獨分組到一個第一狀態集合中。
在s22中,對于每個所述第一狀態集合,其中第一狀態轉移數目最多的狀態可能有一個或多個,若判斷第一狀態轉移的數目最多的狀態只有一個時,將該狀態標記為第一狀態。若判斷第一狀態轉移的數目最多的狀態有至少兩個時,在第一狀態轉移的數目最多的狀態中選擇深度最小的一個狀態標記為第一狀態。所述深度為一個狀態在狀態轉移圖中的層次為該狀態的深度,其中初始狀態的層次為0層。將標記的第一狀態再次單獨分組到一個第二狀態集合中。
在s23中,從所述第一狀態集合中的剩余狀態中選擇第二狀態并標記,所述第二狀態的選擇標準為與所述第一狀態對應同一字符具有相同轉移的數目大于各自的第一狀態轉移數目。從中可以看出所述第二狀態與所述第一狀態對應同一字符具有的相同轉移中除了第一狀態轉移外,一定還包括其他相同轉移。
在s24中,將滿足所述選擇標準的第二狀態再次分組到所述第一狀態所在的第二狀態集合中。并將所述第二狀態指向所述第一狀態的轉移標記為第二狀態轉移。
在s25中,一輪分組后,將所述第一狀態集合中沒被再次分組的狀態重新組合成一個新的第一狀態集合,對所述新的第一狀態集合迭代再次分組的步驟,直到所述第一狀態集合中的每個狀態都被再次分組到某一個第二狀態集合中。第二狀態集合可能為一個第一狀態單獨組成的集合,也可能為第一狀態和第二狀態組成的集合。對每個狀態進行兩次分組是為了對狀態和轉移進行標記。
例如,圖1中,所有狀態的第一狀態轉移相同,將所有狀態分組到一個第一狀態集合中。狀態0、7、8、9的第一狀態轉移數目最多,為6個,但狀態0的深度最小,為0,所以狀態0被標記為第一狀態。將狀態0再次分組到一個新的集合中,所述新的集合為第二狀態集合。對于除狀態0以外的其他每個狀態,與狀態0對應于同一字符具有相同轉移的數目為8或9大于它們自身的核心轉移數目為5或6。因此,將狀態1-9標記為第二狀態,并分組到狀態0所在的第二狀態集合中,將狀態1-9指向狀態0的轉移標記為第二狀態轉移。經過一輪分組,所有的狀態都被分組。
圖2中,除狀態15、18、21、24和26組成的第二狀態集合以外。其他的每個第二狀態集合僅僅包含單個狀態。對于由狀態10、11、12、14、17、20、23和28,它們沒有被分組到一個第二狀態集合中,這是因為盡管它們具有相同的第一狀態轉移,即指向狀態11的轉移,但它們與狀態11對應于同一字符具有相同轉移的數目。
本發明實施例對于所述dfa中的每個狀態進行兩次分組,根據分組結果對每個狀態和每個轉移進行標記,根據標記結果對dfa進行壓縮,去除了dfa中大量的相同轉移,使dfa占用更少的內存。
在上述實施例的基礎上,本發明實施例中所述根據所述狀態的標記和所述轉移的標記對所述dfa進行壓縮,包括:對于每個所述第一狀態,保留該第一狀態的一個第一狀態轉移,將該第一狀態的不同于所述第一狀態轉移的轉移標記為第三狀態轉移,并保留所述第三狀態轉移,該第一狀態的其他轉移不保留;對于每個所述第二狀態,保留該第二狀態的一個第二狀態轉移,將與所述第一狀態對應同一字符的轉移不相同的轉移標記為該第二狀態的第三狀態轉移,并保留所述第三狀態轉移,該第二狀態的其他轉移不保留。
具體地,一個第一狀態的第一狀態轉移指向同一狀態,對于每個所述第一狀態,將該第一狀態的不同于所述第一狀態轉移的轉移標記為該第一狀態的第三狀態轉移,保留該第一狀態的一個第一狀態轉移和第三狀態轉移,該第一狀態的其他轉移不保留。一個第二狀態的第二狀態轉移都指向一個第一狀態。對于每個第二狀態,將該第二狀態與所述第一狀態對應同一字符的轉移不相同的轉移標記為該第二狀態的第三狀態轉移,保留該第二狀態的一個第二狀態轉移和第三狀態轉移,該第二狀態的其他轉移不保留。不保留的轉移被去除掉,減少了所述dfa的數據。所述第一狀態轉移、所述第二狀態轉移和所述第三狀態轉移都有一個標記。其中,所述第三狀態轉移中有一個ascii字符,用于匹配輸入字符進行對應狀態的轉移。所述第一狀態轉移和所述第二狀態轉移有一個區分標記,用于區分所述第一狀態轉移和所述第二狀態轉移。
圖5為前端dfa壓縮后的效果圖,如圖5所示,第一列中沒有星號的轉移為所述第一狀態轉移,對應的狀態為所述第一狀態。第一列中有星號的轉移為所述第二狀態轉移,對應的狀態為所述第二狀態。其它的轉移為所述第三狀態轉移。箭頭表示所述第二狀態指向所述第一狀態。狀態0為第一狀態,為狀態0保留一個第一狀態轉移,即從狀態0指向狀態0的轉移,以及不同于所述第一狀態轉移的第三狀態轉移,即對應字符c、f、i,從狀態0分別指向狀態2、1和3的轉移。狀態1-9為第二狀態,所述第二狀態的第二狀態轉移指向第一狀態,分別為所述第二狀態保留一個第二狀態轉移,即一個指向狀態0的轉移。并為所述第二狀態分別保留與狀態0對應同一字符的轉移不相同的第三狀態轉移,如對于狀態1,保留對應字符i指向狀態4的轉移。
圖6為后端dfa壓縮后的效果圖,如圖6所示,狀態15、18、21、24和26組成一個第一狀態集合,其他的狀態各自單獨組成一個第一狀態集合。狀態15為第一狀態,為狀態15保留一個第一狀態轉移,即從狀態15轉移到狀態15,以及不同于所述第一狀態轉移的第三狀態轉移,即對于字符\n、\.,狀態15分別轉移到狀態11和18。狀態18、21、24和26為第二狀態,所述第二狀態的第二狀態轉移指向狀態15,分別為所述第二狀態保留一個第二狀態轉移,即一個指向狀態15的轉移。并為所述第二狀態分別保留與狀態15對應同一字符的轉移不相同的第三狀態轉移,如對于狀態18,保留對應字符e指向狀態21的轉移。對于其他僅由一個第一狀態組成的第一狀態集合,為所述第一狀態保留一個第一狀態轉移,如從狀態10指向狀態11的轉移,以及不同于所述第一狀態轉移的第三狀態轉移,如對應字符e從狀態10指向狀態12的轉移
對于壓縮后的dfa,每個狀態的轉移大大減少,前端dfa的壓縮率rc為(9×10-19)/(9×10)≈79%,字符數|σ|=9。后端dfa的壓縮率rc為(10×19-37)/(10×19)≈81%,字符數|σ|=10。在實際應用中,字符數|σ|=256,對于dfa的壓縮率可以達到96%以上。與壓縮前的dfa相比,根據公式(nfdfa+nbdfa)*|σ|*(1-rc)*(log2(nfdfa+nbdfa)+8)計算壓縮前后dfa的內存占用大小。其中,nfdfa為前端dfa中的狀態數,nbdfa為后端dfa中的狀態數,rc為壓縮率,假設nfdfa+nbdfa=65536,rc=99%,壓縮前后的dfa內存占用分別為32mb和492kb,減少了幾乎兩個數量級的內存占用。
本實施例對所述第一狀態和所述第二狀態的轉移進行不同方式的保留,對于所述第一狀態,消除了狀態內的冗余。對于所述第二狀態,既消除了狀態內的冗余,也消除了狀態間的冗余,具有較高的壓縮率。
在上述實施例的基礎上,本實施例中所述根據所述狀態的標記和所述轉移的標記對所述dfa進行壓縮,還包括:對于每個狀態的所述第三狀態轉移,若對應于連續的字符存在相同的第三狀態轉移,則對應于該連續的字符僅保留一個第三狀態轉移。
具體地,對于每個狀態的所述第三狀態轉移,如果對應于連續的字符存在相同的第三狀態轉移,則可以將相同的第三狀態轉移合并為一個字符范圍的第三狀態轉移。字符是否連續可以根據字符對應的ascii碼判斷。
例如,一個第二狀態41的第二狀態轉移指向狀態40,第三狀態轉移為(a,41)、(b,41)、(c,41)、(e,42)、(f,41)和(g,41),第二狀態41的第三狀態轉移可以進一步壓縮為([a,c],41)、([e,e],42)和([f,g],41)。其中[a,c]表示字符范圍,是兩個8比特的值,左邊值表示范圍下限為a,字符a對應的ascii碼數值為65。右邊值表示范圍上限是c,字符c對應的ascii碼數值為67。在進行匹配時,按順序比較查找,比如在狀態41中查找對應字符f的轉移,先比較標記轉移([a,c],41)中的字符范圍[a,c],判斷獲知f的ascii碼數值比c的ascii碼數值大,繼續比較([e,e],42)中的字符范圍[e,e],判斷獲知f的ascii碼數值比e的ascii碼數值大,繼續比較([f,g],41)中的[f,g],發現f在[f,g]的端點,當前狀態轉移到下一個狀態41。本實施例中的情況是普遍存在的,通過對每個狀態的第三狀態轉移進行壓縮,進一步提高了dfa的壓縮率。
本實施例提供了一種基于所述dfa壓縮方法的正則表達式匹配方法,包括:讀取壓縮后的所述dfa的當前狀態;在所述當前狀態的第三狀態轉移中查找對應于所述當前輸入字符的第三狀態轉移;若判斷存在對應于所述當前輸入字符的第三狀態轉移,則根據該第三狀態轉移將所述當前狀態轉移到下一個狀態;若判斷不存在對應于所述當前輸入字符的第三狀態轉移,則通過判斷當前狀態為第一狀態或第二狀態,根據當前狀態的第一狀態轉移或第二狀態轉移將當前狀態轉移到下一個狀態。
具體地,所述通過判斷當前狀態為第一狀態或第二狀態,根據當前狀態的第一狀態轉移或第二狀態轉移將當前狀態轉移到下一個狀態,包括:當所述當前狀態為第一狀態時,根據所述當前狀態的第一狀態轉移,將所述當前狀態轉移到下一個狀態;當所述當前狀態為第二狀態時,根據所述當前狀態的第二狀態轉移,將所述當前狀態轉移到所述第二狀態轉移指向的所述第一狀態,在所述第一狀態的所述第三狀態轉移中查找對應于所述當前輸入字符的所述第三狀態轉移;若存在所述當前輸入字符的所述第三狀態轉移,則根據對應于所述當前輸入字符的所述第三狀態轉移,將所述當前狀態轉移到下一個狀態;若不存在所述當前輸入字符的所述第三狀態轉移,則根據所述第二狀態轉移指向的所述第一狀態的第一狀態轉移,將所述當前狀態轉移到下一個狀態。
例如,根據圖5中壓縮的前端dfa對當前輸入字符進行匹配,如果當前狀態為0,當前輸入字符為‘f’,在狀態0的第三狀態轉移中查找輸入字符‘f’的第三狀態轉移,判斷存在對應于輸入字符‘f’的第三狀態轉移,將當前狀態0轉移到狀態1。如果當前狀態為3,當前輸入字符為‘r’,在狀態3的第三狀態轉移中查找輸入字符‘r’的第三狀態轉移,判斷存在對應于輸入字符‘r’的第三狀態轉移,將當前狀態3轉移到狀態6。如果當前狀態為0,當前輸入字符為‘d’,在狀態0的第三狀態轉移中查找輸入字符‘d’的第三狀態轉移,判斷存在輸入字符‘d’的第三狀態轉移,判斷狀態0為第一狀態,根據狀態0的第一狀態轉移,將當前狀態轉移到下一個狀態。如果當前狀態為2,當前輸入字符為‘c’,在狀態2的第三狀態轉移中查找輸入字符‘c’的第三狀態轉移,判斷不存在輸入字符‘c’的第三狀態轉移,判斷狀態2為第二狀態,根據狀態2的第二狀態轉移將狀態2轉移到所述第二狀態轉移指向的狀態0,在狀態0的所述第三狀態轉移中查找對應于字符‘c’的所述第三狀態轉移,判斷存在對應于字符‘c’的第三狀態轉移,則根據該第三狀態轉移,將當前狀態轉移到狀態2。如果當前狀態為3,當前輸入字符為‘d’。在狀態3的第三狀態轉移中查找輸入字符‘d’的第三狀態轉移,判斷不存在輸入字符‘d’的第三狀態轉移,判斷狀態3為第二狀態,根據狀態3的第二狀態轉移將狀態3轉移到所述第二狀態轉移指向的狀態0,在狀態0的所述第三狀態轉移中查找對應于字符‘d’的所述第三狀態轉移,判斷不存在對應于字符‘d’的所述第三狀態轉移,則根據狀態0的第一狀態轉移,將當前狀態轉移到下一個狀態。
綜上所述,在非壓縮的dfa中,對應于當前輸入字符的狀態轉移能夠直接在當前狀態找到并執行,然而對于本實施例中壓縮后的dfa,根據當前狀態找到對應于當前輸入字符的狀態轉移有且只有5種可能且互斥的情況:
情形1,對于當前的第一狀態,對應當前輸入字符的第三狀態轉移被找到并執行。比如圖3中當前狀態為0,當前輸入字符為‘f’;
情形2,對于當前的第一狀態,沒有對應當前輸入字符的第三狀態轉移,即成為第一狀態轉移而被壓縮,第一狀態轉移被找到并執行。比如圖3中當前狀態為0,當前輸入字符為‘d’;
情形3,對于當前的第二狀態,對應當前字符的第三狀態轉移被找到并執行。比如圖3中當前狀態為3,當前輸入字符為‘r’;
情形4,對于當前的第二狀態,沒有對應當前輸入字符的第三狀態轉移,即成為第一狀態轉移而被壓縮,指向第一狀態的第一狀態轉移首先被執行,之后轉到情形1。比如圖3中當前狀態為2,當前輸入字符為‘c’;
情形5,對于當前的第二狀態,沒有對應當前輸入字符的第三狀態轉移,即成為第一狀態轉移而被壓縮,指向第一狀態的第一狀態轉移首先被執行,之后轉到情形2。比如圖3中當前狀態為3,當前輸入字符為‘d’。
上述情形1、2、3只需要一次狀態訪問,而情形4、5需要兩次狀態訪問。因為本發明實施例中根據當前狀態找到對應于當前輸入字符的狀態轉移有且只有5種可能且互斥的情況,所以本發明實施例最壞情況下的狀態訪問次數為確定的2次,能夠保證最壞的匹配處理性能。
本實施例提供的基于所述dfa壓縮方法的正則表達式匹配方法,在使用壓縮后的dfa進行匹配時不影響查找速率。
圖7為本發明實施例提供的dfa壓縮裝置結構圖,如圖7所示,包括構造單元71、標記單元72和壓縮單元73,其中:
構造單元71用于根據正則表達式集合構造dfa,所述dfa包括:字符、狀態和每個狀態各自對應于每個字符的轉移,對應于每個字符,所述轉移從當前狀態指向與該字符相應的一個狀態;標記單元72用于根據所述dfa中的相同轉移對狀態和轉移進行標記,其中所述相同轉移為指向同一狀態的轉移;壓縮單元73用于根據所述狀態的標記和所述轉移的標記對所述dfa進行壓縮。
具體地,所述正則表達式一般包括表述匹配次數的量詞、表述具體位置的錨點和字符串,用于表示字符串集合的規則。在進行正則表達式匹配之前所述構造單元71需要將正則表達式轉換成機器能閱讀的有限自動機。dfa的狀態轉移表是一張二維表,如圖1和圖2所示,包括字符、狀態和每個狀態各自對應于每個字符的轉移。對應于每個字符,所述轉移從當前狀態指向與該字符相應的一個狀態。所述相同轉移為指向同一狀態的轉移,所述標記單元72根據所述相同轉移對所述dfa中狀態和轉移進行標記,所述標記用于區分狀態和轉移。所述壓縮單元73根據狀態的標記和轉移的標記對不同狀態的不同轉移進行不同壓縮,所述壓縮了為去除相同轉移,從而減少dfa中的數據。本實施例的舉例參考方法中對應的舉例,此處不再贅述。
本實施例中標記單元根據dfa中的相同轉移對dfa中的狀態和轉移進行標記,壓縮單元根據狀態的標記和轉移的標記對所述dfa進行壓縮,去除了dfa中冗余的轉移,使dfa占用更少內存。
在上述實施例的基礎上,圖8為本發明實施例提供的dfa壓縮裝置結構圖,如圖8所示,所述標記單元72包括所述標記單元包括第一標記子單元721、第二標記子單元722、第三標記子單元723和迭代子單元724,其中:
所述第一標記子單元721用于為所述dfa中的每個狀態選取該狀態的相同轉移數目最多的轉移標記為該狀態的第一狀態轉移,并將具有相同第一狀態轉移的狀態分組到一個第一狀態集合中;所述第二標記子單元722用于將每個所述第一狀態集合中滿足預設條件的一個狀態標記為第一狀態,并將所述第一狀態再次分組到一個第二狀態集合中;其中,若判斷第一狀態轉移的數目最多的狀態只有一個,所述預設條件包括:第一狀態轉移的數目最多,若判斷第一狀態轉移的數目最多的狀態有至少兩個,則所述預設條件包括:在第一狀態轉移的數目最多的前提下,深度最小;所述第三標記子單元用于723判斷所述第一狀態集合中剩余的每個狀態,若該狀態與所述第一狀態對應同一字符有相同轉移的數目大于該狀態的第一狀態轉移的數目,則將該狀態標記為第二狀態;還用于將所述第二狀態再次分組到所述第一狀態所在的第二狀態集合中,并將所述第二狀態的指向所述第一狀態的轉移標記為第二狀態轉移;所述迭代子單元724用于將所述第一狀態集合中沒被再次分組的狀態組合成一個新的第一狀態集合,并將所述新的第一狀態集合發送到所述第二標記子單元和第三標記子單元以迭代執行再次分組的步驟,直到所述第一狀態集合中的每個狀態都被再次分組到第二狀態集合中。
具體地,所述第一狀態轉移指一個狀態轉移到相同狀態的轉移數目最多的轉移,也可以限定為一個狀態轉移到相同狀態的轉移數目大于預設閾值的轉移。所述第一標記單元721選取狀態的第一狀態轉移后,判斷狀態的第一狀態轉移是否相同,將具有相同第一狀態轉移的狀態分組到一個集合中,所述集合為第一狀態集合。如果一個狀態的第一狀態轉移與其他狀態的第一狀態轉移都不同,則所述第一標記單元721將所述狀態單獨分組到一個第一狀態集合中。
對于每個所述第一狀態集合,其中第一狀態轉移數目最多的狀態可能有一個或多個,若判斷第一狀態轉移的數目最多的狀態只有一個時,所述第二標記單元722將該狀態標記為第一狀態。若判斷第一狀態轉移的數目最多的狀態有至少兩個時,所述第二標記單元722在第一狀態轉移的數目最多的狀態中選擇深度最小的一個狀態標記為第一狀態,并將標記的第一狀態再次單獨分組到一個第二狀態集合中。
所述第三標記單元723從所述第一狀態集合中的剩余狀態中選擇第二狀態并標記,所述第二狀態的選擇標準為與所述第一狀態對應同一字符具有相同轉移的數目大于各自的第一狀態轉移數目。從中可以看出所述第二狀態與所述第一狀態對應同一字符具有的相同轉移中除了第一狀態轉移外,一定還包括其他相同轉移。
所述第三標記單元723將滿足所述選擇標準的第二狀態再次分組到所述第一狀態所在的第二狀態集合中,并將所述第二狀態指向所述第一狀態的轉移標記為第二狀態轉移。
一輪分組后,所述迭代單元724將所述第一狀態集合中沒被再次分組的狀態重新組合成一個新的第一狀態集合,對所述新的第一狀態集合迭代再次分組的步驟,直到所述第一狀態集合中的每個狀態都被再次分組到某一個第二狀態集合中。第二狀態集合可能為一個第一狀態單獨組成的集合,也可能為第一狀態和第二狀態組成的集合。對每個狀態進行兩次分組是為了對狀態和轉移進行標記。本實施例的舉例參考方法中對應的舉例,此處不再贅述。
本實施例對于所述dfa中的每個狀態進行兩次分組,根據分組結果對每個狀態和每個轉移進行標記,根據標記結果對dfa進行壓縮,去除了dfa中大量的相同轉移,使dfa占用更少的內存。
在上述實施例的基礎上,本發明實施例中壓縮單元73具體用于對于每個所述第一狀態,保留該第一狀態的一個第一狀態轉移,將該第一狀態的不同于所述第一狀態轉移的轉移標記為第三狀態轉移,并保留所述第三狀態轉移,該第一狀態的其他轉移不保留;對于每個所述第二狀態,保留該第二狀態的一個第二狀態轉移,將與所述第一狀態對應同一字符的轉移不相同的轉移標記為該第二狀態的第三狀態轉移,并保留所述第三狀態轉移,該第二狀態的其他轉移不保留。
具體地,一個第一狀態的第一狀態轉移指向同一狀態,對于每個所述第一狀態,壓縮單元73將該第一狀態的不同于所述第一狀態轉移的轉移標記為該第一狀態的第三狀態轉移,保留該第一狀態的一個第一狀態轉移和第三狀態轉移,該第一狀態的其他第一狀態轉移不保留。一個第二狀態的第二狀態轉移都指向一個第一狀態,對于每個第二狀態,壓縮單元73將該第二狀態與所述第一狀態對應同一字符的轉移不相同的轉移標記為該第二狀態的第三狀態轉移,保留該第二狀態的一個第二狀態轉移和第三狀態轉移,該第二狀態的其他轉移不保留。不保留的轉移被去除掉,減少了所述dfa中的數據。所述第一狀態轉移、所述第二狀態轉移和所述第三狀態轉移都有一個標記。其中,所述第三狀態轉移中有一個ascii字符,用于匹配輸入字符進行對應狀態的轉移。所述第一狀態轉移和所述第二狀態轉移有一個區分標記,用于區分所述第一狀態轉移和所述第二狀態轉移。本實施例的舉例參考方法中對應的舉例,此處不再贅述。
本實施例對所述第一狀態和所述第二狀態的轉移進行不同方式的保留,對于所述第一狀態,消除了狀態內的冗余。對于所述第二狀態,既消除了狀態內的冗余,也消除了狀態間的冗余,具有較高的壓縮率。
在上述實施例的基礎上,本實施例中的壓縮單元73還具體用于對于每個狀態的所述第三狀態轉移,若對應于連續的字符存在相同的第三狀態轉移,則對應于該連續的字符僅保留一個第三狀態轉移。
具體地,對于每個狀態的所述第三狀態轉移,如果對應于連續的字符存在相同的第三狀態轉移,則壓縮單元73可以將相同的第三狀態轉移合并為一個字符范圍的第三狀態轉移。字符是否連續可以根據字符對應的ascii碼判斷。本實施例的舉例參考方法中對應的舉例,此處不再贅述。本實施例中的情況是普遍存在的,通過對每個狀態的第三狀態轉移進行壓縮,進一步提高了dfa的壓縮率。
圖9為本發明實施例提供的正則表達式匹配系統結構圖,如圖9所示,包括所述壓縮裝置以及讀取單元74、匹配單元75,其中:讀取單元74用于讀取壓縮后的所述確定有限自動機的當前狀態和當前輸入字符;匹配單元75用于在所述當前狀態的第三狀態轉移中查找對應于所述當前輸入字符的第三狀態轉移;若判斷存在對應于所述當前輸入字符的第三狀態轉移,則根據該第三狀態轉移將所述當前狀態轉移到下一個狀態;若判斷不存在對應于所述當前輸入字符的第三狀態轉移,則通過判斷當前狀態為第一狀態或第二狀態,根據當前狀態的第一狀態轉移或第二狀態轉移將當前狀態轉移到下一個狀態。
具體地,所述匹配單元75具體用于當所述當前狀態為第一狀態時,根據所述當前狀態的第一狀態轉移,將所述當前狀態轉移到下一個狀態;當所述當前狀態為第二狀態時,根據所述當前狀態的第二狀態轉移,將所述當前狀態轉移到所述第二狀態轉移指向的所述第一狀態,在所述第一狀態的所述第三狀態轉移中查找對應于所述當前輸入字符的所述第三狀態轉移;若存在所述當前輸入字符的所述第三狀態轉移,則根據對應于所述當前輸入字符的所述第三狀態轉移,將所述當前狀態轉移到下一個狀態;若不存在所述當前輸入字符的所述第三狀態轉移,則根據所述第二狀態轉移指向的所述第一狀態的第一狀態轉移,將所述當前狀態轉移到下一個狀態。本實施例的舉例參考方法中對應的舉例,此處不再贅述。本實施例最壞情況下的狀態訪問次數為確定的兩次,能夠保證最壞的匹配處理性能。本實施例提供的正則表達式匹配系統,在使用壓縮后的dfa進行匹配時不影響查找速率。
本發明提出的dfa壓縮方法及裝置、正則表達式匹配方法及系統,并不局限于網絡安全、網絡監控和網絡過濾領域,凡是基于內容的網絡處理服務或者涉及到利用給定特征來匹配給定內容的應用,都能使用基于本發明提出的正則表達式壓縮、匹配方法進行優化處理,比如海量數據的查找和分類、web搜索、文本編輯中的查找替換等。
最后,本申請的方法僅為較佳的實施方案,并非用于限定本發明的保護范圍。凡在本發明的精神和原則之內,所作的任何修改、等同替換、改進等,均應包含在本發明的保護范圍之內。