发明内容
本发明提供了一种字符串的匹配方法及装置,以至少解决现有技术中进行匹配的速度较慢的问题。
为了实现上述目的,根据本发明的一个方面,提供了一种字符串的匹配方法。
根据本发明的字符串的匹配方法包括:获取字符映射表,其中,在字符映射表中,所有与预设字符串中的字符不同的字符均对应于第一映射字符,第一映射字符与预设字符串中的字符在字符映射表中的映射字符均不同;接收输入数据;获取输入数据中的字符在字符映射表中的映射字符;以及将获取到的映射字符组成的字符串与预设字符串在字符映射表中的映射的字符串相匹配。
进一步地,获取字符映射表包括:获取预设字符串中不同字符的数量M;获取预设字符串中的字符在字符映射表中的映射字符,其中,预设字符串中的字符按顺序映射为0至M-1;以及获取与预设字符串中的字符不同的字符在字符映射表中的映射字符M。
进一步地,获取输入数据中的字符在字符映射表中的映射字符包括:获取URL中与预设字符串中的字符相同的字符在字符映射表中的映射字符;以及获取URL中与预设字符串中的字符相同的字符在字符映射表中的映射字符M。
进一步地,获取字符映射表包括:将与预设字符串中的字符相同的字符映射为字符本身;以及将所有与预设字符串中的字符不同的字符映射为第一映射字符,其中,第一映射字符与预设字符串中的字符均不同。
进一步地,将获取到的映射字符组成的字符串与预设字符串在字符映射表中的映射的字符串相匹配之后,上述方法还包括:获取由经过映射的输入的数据中的字符构成的矩阵;以及存储由矩阵的下标和值组成的二元组以压缩矩阵。
为了实现上述目的,根据本发明的另一个方面,提供了一种字符串的匹配装置,该装置用于执行本发明提供的任意一种字符串的匹配方法。
根据本发明的另一方面,提供了一种字符串的匹配装置。该字符串的匹配装置包括:第一获取单元,用于获取字符映射表,其中,在字符映射表中,所有与预设字符串中的字符不同的字符均对应于第一映射字符,第一映射字符与预设字符串中的字符在字符映射表中的映射字符均不同;接收单元,用于接收输入数据;第二获取单元,用于获取输入数据中的字符在字符映射表中的映射字符;以及匹配单元,用于将获取到的映射字符组成的字符串与预设字符串在字符映射表中的映射的字符串相匹配。
进一步地,第一获取单元包括:第一获取子单元,用于获取预设字符串中不同字符的数量M;第二获取子单元,用于获取预设字符串中的字符在字符映射表中的映射字符,其中,预设字符串中的字符按顺序映射为0至M-1;以及第三获取子单元,用于获取与预设字符串中的字符不同的字符在字符映射表中的映射字符M。
进一步地,第二获取单元包括:第四获取子单元,用于获取URL中与预设字符串中的字符相同的字符在字符映射表中的映射字符;以及第五获取子单元,用于获取URL中与预设字符串中的字符相同的字符在字符映射表中的映射字符M。
进一步地,第一获取单元包括:第一映射子单元,用于将与预设字符串中的字符相同的字符映射为字符本身;以及第二映射子单元,用于将所有与预设字符串中的字符不同的字符映射为第一映射字符,其中,第一映射字符与预设字符串中的字符均不同。
进一步地,上述装置还包括:第三获取单元,用于获取由经过映射的输入的数据中的字符构成的矩阵;以及压缩单元,用于存储由矩阵的下标和值组成的二元组以压缩矩阵。
通过本发明,将所有预设字符串中没有出现过的字符都映射到同一个字符,因此在进行匹配的过程中,仅需识别某一字符是否与预设字符串中的字符匹配,而不用分别识别各个未被匹配的字符,减小了进行匹配时的内存的占用,提高了匹配的速度,解决了现有技术中进行匹配的速度较慢的问题,进而提高了匹配的效率。
具体实施方式
需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本发明。
本发明实施例提供了一种字符串的匹配装置,以下对本发明实施例所提供的字符串的匹配装置进行介绍。
图1是根据本发明实施例的字符串的匹配装置的结构框图。
如图1所示,该字符串的匹配装置包括第一获取单元11、接收单元12、第二获取单元13和匹配单元14。
第一获取单元11用于获取字符映射表,其中,在字符映射表中,所有与预设字符串中的字符不同的字符均对应于第一映射字符,第一映射字符与预设字符串中的字符在字符映射表中的映射字符均不同。
例如,当预设字符串为“abc”和“bcd”时,可以将a映射为0,b映射为1,c映射为2,d映射为3,那么除了a、b、c和d之外的所有字符都将被映射到4。
接收单元12用于接收输入数据。
第二获取单元13用于获取输入数据中的字符在字符映射表中的映射字符。
在本实施例中,如果输入数据是“abcefg”,输入数据中的字符可以被逐个映射为012444。
匹配单元14用于将获取到的映射字符组成的字符串与预设字符串在字符映射表中的映射的字符串相匹配。
匹配单元14可以通过确定有限状态自动机DFA来实现匹配功能。
在本实施例中,将所有预设字符串中没有出现过的字符都映射到同一个字符,因此在进行匹配的过程中,仅需识别某一字符是否与预设字符串中的字符匹配,而不用分别识别各个未被匹配的字符,减小了进行匹配时的内存的占用,提高了匹配的速度,进而提高了匹配的效率。
图2是根据本发明优选实施例的字符串的匹配装置的结构框图。该实施例可以作为上述实施例的优选实施方式。
如图2所示,该字符串的匹配装置包括第一获取单元11、接收单元12、第二获取单元13和匹配单元14,其中,第一获取单元11包括第一获取子单元112、第二获取子单元114和第三获取子单元116。
第一获取子单元112用于获取预设字符串中不同字符的数量M。
第二获取子单元114用于获取预设字符串中的字符在字符映射表中的映射字符,其中,预设字符串中的字符按顺序映射为0至M-1。
第三获取子单元116用于获取与预设字符串中的字符不同的字符在字符映射表中的映射字符M。
在该实施例中,通过数字编号的方法对字符进行映射,进一步保证映射过程的准确性,减小出现错误的概率。
本实施例可以被应用在URL过滤的场景中,优选地,第二获取单元13包括第四获取子单元和第五获取子单元。第四获取子单元用于获取URL中与预设字符串中的字符相同的字符在字符映射表中的映射字符。第五获取子单元用于获取URL中与预设字符串中的字符相同的字符在字符映射表中的映射字符M。
为了简化映射过程,可以仅对与预设字符串中的字符不同的字符进行映射,而将与预设字符串中的字符相同的字符映射映射为自身,优选地,第一获取单元11包括第一映射子单元和第二映射子单元。第一映射子单元用于将与预设字符串中的字符相同的字符映射为该字符本身。第二映射子单元用于将所有与预设字符串中的字符不同的字符映射为第一映射字符,其中,第一映射字符与预设字符串中的字符均不同。
在本实施例中,可以通过压缩的方式减小内存的占用以提高匹配性能,优选地,上述装置还包括第三获取单元和压缩单元。第三获取单元用于获取由经过映射的输入的数据中的字符构成的矩阵。压缩单元用于存储由矩阵的下标和值组成的二元组以压缩矩阵。
本发明实施例还提供了一种字符串的匹配方法,该方法可以基于上述的字符串的匹配装置来执行。
图3是根据本发明实施例的字符串的匹配方法的流程图。
如图3所示,该字符串的匹配方法包括如下的步骤S302至步骤S308。
步骤S302,获取字符映射表,其中,在字符映射表中,所有与预设字符串中的字符不同的字符均对应于第一映射字符,第一映射字符与预设字符串中的字符在字符映射表中的映射字符均不同。
进行映射的目的之一是为了对所有与预设字符串中的字符不同的字符进行无差异的处理,因此,在本实施例中,确定输入字符与预设字符是否匹配即可,该字符是具体什么字符可以不予考虑。
在进行字符匹配,生成DFA图时,字符集都会被取为一个字节的取值范围,即0-255,这样每个状态对应的转移数组的长度也就是256,实际上,我们根据对生成原始正则表达式的分析可以发现,很多字符在所有状态下引起的转移是确定的,比如要匹配的原始字符串是“abcd”、“gcp.*fk”和“<html.*>”这三个,可以看到,输入为0-9这些数字的时候,无论当前是什么状态,其转移永远都是跳到同样的下一状态。
根据这个特点,可以对字符集做一个映射,把这些预设的需要匹配的字符串中没有出现过的字符都映射成一个字符然后再进行DFA转换和合并等。这样最后生成的DFA的每状态转移数组可能比直接使用大小为256的字符集小的多,从而达到较小内存占用的目的。
为了使本步骤更加简便,可以仅对与预设字符串中的字符不同的字符进行映射,即将与预设字符串中的字符相同的字符映射映射为自身。这一优选实施例可以通过以下两个步骤来实现:
首先,将与预设字符串中的字符相同的字符映射为该字符本身。
然后,将所有与预设字符串中的字符不同的字符映射为第一映射字符,其中,第一映射字符与预设字符串中的字符均不同。
例如预设字符串是“abc”和“bcd”,那么a、b、c和d四个字符在字符映射表中对应的字符是其本身,除了这四个字符以外的字符均映射到一个不同于a、b、c和d的字符,例如x,那么在该字符映射表中,a对应的字符是a,b对应的字符是b,c对应的字符是c,d对应的字符是d,其他所有字符均对应到字符x,x既可以是预设的,也可以是从a、b、c和d之外的字符中随机选取的。
在另一种优选实施方式中,可以获取预设字符串中不同字符的数量,然后通过数字编号的方法对字符进行映射,这种步骤可以进一步保证映射过程的准确性,减小出现错误的概率,这一优选实现方式可以通过以下三个步骤来实现:
首先,获取预设字符串中不同字符的数量M。
然后,获取预设字符串中的字符在字符映射表中的映射字符,其中,预设字符串中的字符按顺序映射为0至M-1。
最后,获取与预设字符串中的字符不同的字符在字符映射表中的映射字符M。
还是以预设字符串为“abc”和“bcd”的情况为例,在这样的情况下,预设字符串中有4个不同的字符,即a、b、c和d,那么M为4,将a映射为0,b映射为1,c映射为2,d映射为3,那么除了a、b、c和d之外的所有字符都将被映射到4。
步骤S304,接收输入数据。
本实施例可以被运用在防火墙上,因此,接收到的输入数据可以是互联网上的任意数据。
步骤S306,获取输入数据中的字符在字符映射表中的映射字符。
如前述映射方法,将a映射为0,b映射为1,c映射为2,d映射为3,那么除了a、b、c和d之外的所有字符都将被映射到4,如果在本步骤中输入数据是“abcefg”,根据该映射方法,输入数据中的字符被逐个映射为012444。
该技术可以被用于URL的过滤,因此可以获取URL中与预设字符串中的字符相同的字符在字符映射表中的映射字符,并获取URL中与预设字符串中的字符相同的字符在字符映射表中的映射字符M。
步骤S308,将获取到的映射字符组成的字符串与预设字符串在字符映射表中的映射的字符串相匹配。
匹配的过程有多种方式,常见的比如可以通过DFA来实现,通过本实施例进行字符集映射后,一般情况下,DFA的存储空间可以大幅减少。与未进行字符集映射的DFA相比,性能几乎没有下降(根据处理器的实际情况一般有所提高),而且本步骤和其他的DFA压缩方法并不互斥,如果本实施例达到的压缩效果不尽如人意,在性能允许的情况下,可以使用其他的DFA压缩方式,进一步降低内存占用率。比如,根据DFA是一个稀疏矩阵的特点,由于跳转到0状态的转移都可以不做记录,所以可以使用存储(下标、值)二元组的方式来压缩一个稀疏矩阵。
因此,在步骤S308以后,还可以获取由经过映射的输入的数据中的字符构成的矩阵,并存储由矩阵的下标和值组成的二元组以压缩矩阵。
在本实施例中,与未压缩的DFA相比,性能几乎没有下降(根据处理器的实际情况可能略有提高),而且该步骤和其他的DFA压缩方法不互斥,如果本方法达到的压缩效果不尽如人意,在性能允许的情况下,可以使用其他的DFA压缩方式,进一步降低内存占用率。
图4是根据本发明实施例的字符串的匹配方法的流程图。
如图4所示,该字符串的匹配方法包括如下的步骤S401至步骤S407。
步骤S401,获取预设字符串,即被匹配字符串。
步骤S402,获取字符映射表。
具体地,对于给定的多个被匹配字符串s1,s2,s3...sN,无论是平凡串还是正则表达式,假设每个字符串包含的字符集合为C1,C2,C3....CN,则集合C=C1∪C2∪C3...∪CN。假设C中包含的字符数为M。
使用一个数组来完成如下映射:
f:C->{0,1,2,...M-1}
f:!C->{M}
也就是所有被匹配字符串中出现的字符被分别映射到0~M-1,未出现的字符被映射为M。
使用这个f映射对原字符串s1,s2...sN做转换,转换得到s1’,s2’...sN’。
使用s1’,s2’....来进行DFA转换和合并,并可以辅以其它压缩存储方式。
步骤S403,生成DFA图。
步骤S404,获取输入数据。
步骤S405,将输入数据中的字符按步骤S402中获取的字符映射表进行映射。
步骤S406,将输入数据中的字符映射的字符与预设字符串中的字符映射的字符进行匹配。
步骤S407,获取匹配结果。
对映射后的字符进行DFA查找即可得到匹配结果。
可见在匹配的时候,需要多一次映射,这个字符映射表一般是一个256长度的数组,性能影响可以忽略不计。算上定长数组带来的内存分配和访问性能的提高,实际性能反而有所提升。
从以上的描述中,可以看出,本发明实施例提供的方法在内存受限、需要进行多模字符串匹配的场景下有广泛使用,比如流行病毒的扫描、入侵防御系统、URL过滤和网页关键字过滤系统等。在URL过滤的设备中,实际的用户场景中,由于过滤规则包含的字符种类不多,使用本实施例提供的方法后,内存压缩60%以上,性能提升50%。
需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
显然,本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。