本发明涉及字符串匹配技术领域,特别涉及一种多模式字符串匹配系统及方法。
背景技术:
在网络安全、信息检索及生物信息学等领域为了实现模式串的快速识别及定位,常采用多模式字符串匹配。目前的多模式匹配的算法主要是为模式集(模式集中包括n个模式串)预先构造各种数据结构,如:ac(aho-corasickautomaton)算法、wu-manber算法和sbom算法等,然后再将文本串作为输入来实现多模式匹配。在将这些多模式匹配算法应用到实际的业务中时常常遇到如下几个问题:
多模式字符串匹配引擎通常都是事先加载各种预定的特征字符串(即模式集),并通过编译操作生成自动机、查找树等数据结构。然后让匹配引擎读取各种待匹配的字符串数据,并输出匹配结果。在匹配的过程中,如果需要动态的添加特征字符串(比如:某种恶意计算机病毒新增了一个特征,需要立刻添加到匹配库中),则比较困难。
现有技术中,如果需要动态的添加和删除特征字符串,通常需要互斥锁,先将匹配引擎的匹配过程阻塞,然后等待添加或删除完成后才能继续进行匹配,由于添加或删除动作需要重新生成自动机,随着添加的特征字符串的增加,这种生成自动机的过程耗时可能达到几分钟、甚至几十分钟,这种长时间的阻塞,对业务的正常运行影响非常大。
另外,在网络报文的多模式字符串匹配中,不仅仅需要知道命中了哪些特征字符串,还需要知道命中的字符串出现在网络报文中的位置,以及该特征字符串属于哪个规则id、哪个类等附属信息。因此现在常用的命中结果集常常由n个命中单元组成,每个命中单元保存特征字符串出现在网络报文中的位置和该特征字符串的附属信息。这种结果集的设计,由于结果集的大小的限制,常常导致漏命中的情况。比如:有两个特征字符串“ab”和“mm”,都添加到模式集中,设置结果集最多能保存5个匹配命中结果。输入一个待匹配的字符串“abmabnabkabdabdmabnnabrabdmmb”,那么结果集中只能命中特征字符串“ab”的五个偏移值和属性,不能命中特征字符串“mm”的偏移值和属性。这种问题虽然可以通过增大结果集的方式缓解,但是在实际应用中,有可能用户输入的特征字符串只有1个字符,那么即使设置结果集最多能保存30个命中结果,漏命中的情况还是非常严重。
在许多字符串匹配的应用场景中,特征字符串是从不同类别的规则里面下发的,因此需要对命中结果进行分类处理。
技术实现要素:
本发明提出一种多模式字符串匹配系统及方法,解决现有的多模式字符串匹配方案中动态的添加和删除特征字符串时需要阻塞匹配流程的问题。
本发明的一种多模式字符串匹配系统,包括:
初始化单元,用于根据传入的初始化参数设置多模式字符串匹配算法、设置可添加特征字符串的总数量、结果集容量及初始化特征字符串存储单元中的hash链表,并将设置好的初始化参数值存储到字符串副匹配单元中;
特征字符串存储单元,用于计算特征字符串的hash值,并根据所述hash值将特征字符串及其属性存储到所述hash链表中;
特征字符串编辑单元,用于向特征字符串存储单元添加和删除特征字符串及其属性,还用于修改字符串副匹配单元中保存的初始化参数;
特征字符串编译单元,用于读取所述特征字符串存储单元中的所有特征字符串,根据设置的多模式字符串匹配算法对所有的特征字符串进行编译,形成特定的数据结构,编译完成后,将所述特定数据结构和相关的多模式字符串匹配参数存储到字符串副匹配单元;
字符串主匹配单元,用于对输入的待匹配字符串及其属性进行多模式字符串匹配,并将匹配结果发送至结果集处理单元保存;
字符串副匹配单元,用于在核心节点互换前,保存编译的特定数据结构和所述匹配参数,在核心节点互换后,保存老的核心节点,等待老的核心节点上的匹配流程完成,然后进行重新初始化,释放老的数据结构,并复制字符串主匹配单元中的配置参数;
结果集处理单元,用于存储字符串匹配的结果。
其中,所述结果集处理单元中记录有命中结果存储列表,所述结果集处理单元中还用于在接收到匹配结果后判断该命中的特征字符串是否已经记录在所述命中结果存储列表中,若是,则读取对应的命中记录,在偏移值数组未满的情况下,将命中的偏移值存储在偏移值数组中,偏移值数组用量加1,否则,新建该命中的特征字符串的命中记录并存储到命中结果存储列表中,结果集使用量加1。
其中,初始化单元还用于设置结果分类参数,所述结果分类参数包括:匹配结果的分类标识、每个类的属性、每类匹配结果占用多少个命中记录及每个命中结果中每类命中记录能保存多少个偏移值;所述结果集处理单元在新建该命中的特征字符串的命中记录并存储到命中结果存储列表中,结果集使用量加1之后还用于查询该命中的特征字符串的属性中所有的分类标识,查询出各个分类标识对应类别能存储的偏移值数量,比较各个偏移值数量以得到最大值,将所述最大值赋值给命中记录中的偏移值数组容量,该命中的特征字符串所属类别的命中特征串数各加1,将命中的偏移值存储至偏移数组中,偏移值数组用量加1。
其中,结果集处理单元在接收到匹配结果后还用于判断结果集容量是否已满,如果已满,通知字符串主匹配单元和字符串副匹配单元对所述待匹配字符串不继续匹配。
本发明还提供了一种基于上述任一项所述的多模式字符串匹配系统的方法,包括步骤:
s1:根据传入的初始化参数设置多模式字符串匹配算法、设置可添加特征字符串的总数量、结果集容量及初始化所述特征字符串存储单元中的hash链表,并将设置好的初始化参数值存储到字符串副匹配单元中;
s2:特征字符串编辑单元向特征字符串存储单元添加和删除特征字符串及其属性,还可以修改字符串副匹配单元中保存的初始化参数;
s3:特征字符串编译单元读取所述特征字符串存储单元中的所有特征字符串,根据设置的多模式字符串匹配算法对所有的特征字符串进行编译,形成特定的数据结构;
s4:编译完成后,特征字符串编译单元将新生成的核心节点放到字符串主匹配单元,将老的核心节点放到字符串副匹配单元,所有新的数据匹配流程通过字符串主匹配单元的新核心节点完成;对于互换前已经进入老的核心节点的匹配流程,将在字符串副匹配单元完成,产生的匹配结果交给结果集处理单元进行保存;
s5:等待字符串副匹配单元中的所有匹配流程完成,重新初始化字符串副匹配单元,释放之前编译的数据结构,并将当前的字符串主匹配单元中的初始化参数都复制到字符串副匹配单元中;
s6:将待匹配字符串及其属性输入到字符串主匹配单元中进行匹配,字符串主匹配单元将匹配结果交给结果集处理单元进行保存。
其中,所述步骤s4和s6中,结果集处理单元在接收到匹配结果后判断该命中的特征字符串是否已经记录在预设的命中结果存储列表中,若是,则读取对应的命中记录,在偏移值数组未满的情况下,将命中的偏移值存储在偏移值数组中,偏移值数组用量加1,否则,新建该命中的特征字符串的命中记录并存储到命中结果存储列表中,结果集使用量加1。
其中,所述步骤s1中还包括:初始化单元设置结果分类参数,所述结果分类参数包括:匹配结果的分类标识、每个类的属性、每类匹配结果占用多少个命中记录及每个命中结果中每类命中记录能保存多少个偏移值;所述结果集处理单元在新建该命中的特征字符串的命中记录并存储到命中结果存储列表中,结果集使用量加1之后还用于查询该命中的特征字符串的属性中所有的分类标识,查询出各个分类标识对应类别能存储的偏移值数量,比较各个偏移值数量以得到最大值,将所述最大值赋值给命中记录中的偏移值数组容量,该命中的特征字符串所属类别的命中特征串数各加1,将命中的偏移值存储至偏移数组中,偏移值数组用量加1。
其中,所述步骤s4和s6中:结果集处理单元在接收到匹配结果后还用于判断结果集容量是否已满,如果结果集已满,通知字符串主匹配单元和字符串副匹配单元对所述待匹配字符串不继续匹配。
本发明的多模式字符串匹配系统及方法中,采用这种一主一副的设计,通过字符串主匹配单元和字符串副匹配单元之间交换核心节点,实现了动态增加和删除特征字符串的目的,并且在这个过程中,不用阻塞数据的匹配流程,保障了业务的连续性。
本发明由于采用以上技术方案,具有显著的技术效果:
1、通过多模式字符串主匹配单元和多模式字符串副匹配单元实现了动态增加和删除特征字符串的目的。并且在这个过程中,不用阻塞数据的匹配流程,保障了业务的连续性。
2、通过优化结果集的存储方式,使得一个命中的特征字符串只能占用一个命中记录,这个特征字符串如果命中多次,就在这个命中记录里保存多次命中的偏移值。避免了一个特征字符串命中多次,占用多个命中记录的问题,从而大大的降低了漏命中的情况发生。
3、结果集的分类,限定了不同种类的命中结果占用结果集中的命中记录数量,从而进一步降低了漏命中情况。而且由于结果集分类,有利于提高业务层对结果集的使用效率。
4、由于采用这种一主一副的设计,并且主单元和副单元各自保存初始化参数,可以动态的修改多模式字符串匹配算法、匹配结果的分类、每类匹配结果占用多少个命中记录、每个命中记录能保存多少个偏移值等参数的值。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本发明的一种多模式字符串匹配系统结构示意图;
图2为本发明的多模式字符串匹配系统中核心节点的数据结构示意图;
图3为本发明的多模式字符串匹配系统中多模式字符串主和副匹配单元切换本质上是核心节点交换的过程;
图4为本发明的多模式字符串匹配系统中结果集的数据结构示意图;
图5为本发明的多模式字符串匹配方法流程图;
图6为本发明的多模式字符串匹配方法中结果集处理的流程图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本实施例的多模式字符串匹配系统如图1所示,包括:
初始化单元1,用于根据传入的初始化参数设置多模式字符串匹配算法、设置可添加特征字符串的总数量、结果集容量及初始化所述特征字符串存储单元中的hash链表,最后将设置好的初始化参数值存储到字符串副匹配单元6中。
特征字符串存储单元2,用于计算特征字符串的hash值,并根据所述hash值将特征字符串及其属性存储到hash链表中。
特征字符串编辑单元3,用于向特征字符串存储单元2添加和删除特征字符串及其属性,还用于修改字符串副匹配单元6中保存的初始化参数。具体地,增加特征字符串及其属性到特征字符串存储单元2,或从特征字符串存储单元2中删除特征字符串及其属性。其中,特征字符串的属性包括:特征字符串的id,若需要在结果集中分类处理,该属性还包括:特征字符串的分类标识。
特征字符串编译单元4,用于读取所述特征字符串存储单元中的所有特征字符串,根据所述多模式字符串匹配算法对所有的特征字符串进行编译,形成特定的数据结构,数据结构的具体形式与算法有关,不同的多模式字符串匹配算法会形成不同的数据结构。编译完成后,将所述特定数据结构和相关的多模式字符串匹配参数存储到字符串副匹配单元6中。即特征字符串编译单元4根据特定数据结构和相关的多模式字符串匹配参数生成一个新的核心节点。其中,相关的多模式字符串匹配参数和初始化参数相对应,包括:多模式字符串匹配算法、可添加特征字符串的总数量、结果集容量及初始化特征字符串存储单元的hash链表的容量,若需要对结果分类还包括下述的结果分类参数。本实施例中,多模式字符串匹配算法可以是常用的ac(aho-corasick)算法或hyperscan等。
字符串主匹配单元5,用于对输入的待匹配字符串及其属性进行多模式字符串匹配,并将匹配结果发送至结果集处理单元保存。其中,待匹配字符串的属性包括:所属报文流、属于上行报文还是下行报文以及字符串的总长度。
字符串副匹配单元6,用于在核心节点互换前,保存编译的特定数据结构和所述匹配参数,在核心节点互换后,保存老的核心节点,等待老的核心节点上的匹配流程完成,然后进行重新初始化(即执行初始化模块1),释放老的数据结构,并复制字符串主匹配单元5中的配置参数。
结果集处理单元7,用于存储字符串匹配的结果。
其中,核心节点数据结构如图2所示,字符串主匹配单元5和字符串副匹配单元6都采用相同的核心节点数据结构保存初始化的相关参数。本实施例中,字符串主匹配单元5和字符串副匹配单元6切换本质上是核心节点交换的过程,可以通过常用的创建临时指针及指针赋值的方式来完成,采用这种一主一副的设计,字符串主匹配单元5和字符串副匹配单元6各自保存多模式字符串匹配参数,可以动态的修改多模式字符串匹配参数。而且通过字符串主匹配单元5和字符串副匹配单元6之间交换核心节点,实现了动态增加和删除特征字符串的目的,并且在这个过程中,不用阻塞数据的匹配流程,保障了业务的连续性。
切换过程只会有以下两种情况:
1、特征串匹配过程还在老的核心节点上进行,由于老的核心节点需要等待匹配流程全部执行完才执行释放和重新初始化操作,因此对业务没有影响;
2、特征串匹配过程在新的核心节点进行,这个是正常的流程,因此这种无锁化的切换是安全的。
具体交换过程如图3所示:
mainnode:字符串主匹配单元5的核心节点指针;
minornode:字符串副匹配单元6的核心节点指针;
tmpnode:临时核心节点指针;
node1:老的核心节点指针,保存着老的编译数据和老的配置参数;
node2:新的核心节点指针,保存着新的编译数据和新的配置参数;
切换前:
字符串主匹配单元5的核心节点指针mainnode指向老的核心节点指针node1,老的核心节点指针保存着老的编译数据和老的配置参数。字符串副匹配单元6的核心节点指针minornode指向新的核心节点指针node2,新的核心节点指针保存着新的编译数据和新的配置参数。
切换中:
用一个临时核心节点指针tmpnode保存老的核心节点node1,将新的核心节点node2赋值给字符串主匹配单元5的核心节点指针mainnode。然后将临时核心节点指针tmpnode赋值给字符串副匹配单元6的核心节点指针minornode。
切换后:
字符串主匹配单元5的核心节点指针mainnode指向新的核心节点指针node2。字符串副匹配单元6的核心节点指针minornode指向老的核心节点指针node1。
等待字符串副匹配单元6中老的匹配流程执行完毕后,将对字符串副匹配单元6进行重新初始化,释放老的数据结构,将字符串主匹配单元5中的配置参数复制过来。字符串副匹配单元6初始化完成后等待下一次的添加删除特征字符串或修改配置参数。
本实施例中,结果集的数据结构如图4所示,结果集处理单元7中记录有命中结果存储列表,结果集处理单元7中还用于在接收到匹配结果后判断该命中的特征字符串是否已经记录在所述命中结果存储列表中,若是,则读取对应的命中记录,在偏移值数组未满的情况下,将命中的偏移值存储在偏移值数组中,偏移值数组用量加1,否则,新建该命中的特征字符串的命中记录并存储到命中结果存储列表中,结果集使用量加1。通过优化结果集的存储方式,使得一个命中的特征字符串只能占用一个命中记录,这个特征字符串如果命中多次,就在这个命中记录里保存多次命中的偏移值。避免了一个特征字符串命中多次,占用多个命中记录的问题,从而大大的降低了漏命中的情况发生。
进一步地,初始化单元1还用于设置结果分类参数,结果分类参数包括:匹配结果的分类标识、每个类的属性、每类匹配结果占用多少个命中记录及每个命中结果中每类命中记录能保存多少个偏移值;结果集处理单元7在新建该命中的特征字符串的命中记录并存储到命中结果存储列表中,结果集使用量加1之后还用于查询该命中的特征字符串的属性中所有的分类标识,查询出各个分类标识对应类别能存储的偏移值数量,比较各个偏移值数量以得到最大值,将所述最大值赋值给命中记录中的偏移值数组容量,该命中的特征字符串所属类别的命中特征串数各加1,将命中的偏移值存储至偏移数组中,偏移值数组用量加1。结果集的分类,限定了不同种类的命中结果占用结果集中的命中记录数量,从而进一步降低了漏命中情况。而且由于结果集分类,有利于提高业务层对结果集的使用效率。
本实施例中,结果集处理单元7在接收到匹配结果后还用于判断结果集容量是否已满,如果已满,通知字符串主匹配单元5和字符串副匹配单元6对待匹配字符串不继续匹配。
本发明还提供了一种基于上述任一项所述的多模式字符串匹配系统的方法,如图5所示,包括:
步骤s1,根据传入的初始化参数设置多模式字符串匹配算法、设置可添加特征字符串的总数量、结果集容量及初始化所述特征字符串存储单元中的hash链表,并将设置好的初始化参数值存储到字符串副匹配单元中。
步骤s2,特征字符串编辑单元向特征字符串存储单元添加和删除特征字符串及其属性,还可以修改字符串副匹配单元中保存的初始化参数。
步骤s3,特征字符串编译单元读取所述特征字符串存储单元中的所有特征字符串,根据所述多模式字符串匹配算法对所有的特征字符串进行编译,形成特定的数据结构。
步骤s4,编译完成后,特征字符串编译单元将新生成的核心节点放到字符串主匹配单元,将老的核心节点放到字符串副匹配单元,所有新的数据匹配流程通过字符串主匹配单元的新核心节点完成;对于互换前已经进入老的核心节点的匹配流程,将在字符串副匹配单元完成,产生的匹配结果交给结果集处理单元进行保存。
步骤s5,等待字符串副匹配单元中的所有匹配流程完成,重新初始化字符串副匹配单元,释放之前编译的数据结构,并将当前的字符串主匹配单元中的初始化参数都复制到字符串副匹配单元中。
步骤s6,将待匹配字符串及其属性输入到字符串主匹配单元中进行匹配,字符串主匹配单元将匹配结果交给结果集处理单元进行保存。
本方法中,通过字符串主匹配单元和字符串副匹配单元实现了动态增加和删除特征字符串的目的,并且在这个过程中,不用阻塞数据的匹配流程,保障了业务的连续性。而且由于采用这种一主一副的设计,主单元和副单元各自保存初始化参数,可以动态的修改多模式字符串匹配参数。
步骤s4和s6中,结果集处理单元在接收到匹配结果后判断该命中特征字符串是否已经记录在预设的命中结果存储列表中,若是,则读取对应的命中记录,在偏移值数组未满的情况下,将命中的偏移值存储在偏移值数组中,偏移值数组用量加1,否则,新建该命中的特征字符串的命中记录并存储到命中结果存储列表中,结果集使用量加1。通过优化结果集的存储方式,使得一个命中的特征字符串只能占用一个命中记录,这个特征字符串如果命中多次,就在这个命中记录里保存多次命中的偏移值。避免了一个特征字符串命中多次,占用多个命中记录的问题,从而大大的降低了漏命中的情况发生。
步骤s1中还包括:初始化单元设置结果分类参数,所述结果分类参数包括:匹配结果的分类标识、每个类的属性、每类匹配结果占用多少个命中记录及每个命中结果中每类命中记录能保存多少个偏移值;所述结果集处理单元在新建该命中的特征字符串的命中记录并存储到命中结果存储列表中,结果集使用量加1之后还用于查询该命中的特征字符串的属性中所有的分类标识,查询出各个分类标识对应类别能存储的偏移值数量,比较各个偏移值数量以得到最大值,将所述最大值赋值给命中记录中的偏移值数组容量,该命中的特征字符串所属类别的命中特征串数各加1,将命中的偏移值存储至偏移数组中,偏移值数组用量加1。
步骤s4和s6中,结果集处理单元在接收到匹配结果后还用于判断结果集容量是否已满,如果已满,通知字符串主匹配单元和字符串副匹配单元对所述待匹配字符串不继续匹配。
具体地,结果集处理单元对匹配结果的分类处理的整体详细流程如图6所示,包括:
步骤s201,在字符串主匹配单元或字符串副匹配单元将新增的匹配结果(即命中的特征字符串)发送至结果集入口后,判断结果集是否已满,若是,执行步骤s202,否则执行步骤s203。
步骤s202,通知字符串主匹配单元和字符串副匹配单元对所述待匹配字符串不继续匹配。
步骤s203,遍历命中结果存储列表。
步骤s204,判断该命中的特征字符串是否已经记录在命中结果存储列表中,若是,则执行步骤s205,否则执行步骤s210。
步骤s205,读取命中结果存储列表中该特征字符串的命中记录。
步骤s206,判断偏移值数组是否已满,若是,执行步骤s207,否则,执行步骤s208。
步骤s207,丢弃命中的偏移值。
步骤s208,将命中的偏移值存入偏移值数组。
步骤s209,偏移值数组已使用量加1。
步骤s210,新建该命中的特征字符串的命中记录并存储到命中结果存储列表中。
步骤s211,结果集已使用量加1。
步骤s212,查询该命中的特征字符串的属性中所有的分类标识。
步骤s213,查询出每个分类标识对应类别能存储的偏移值数量的最大值,将所述最大值赋值给命中记录中的偏移值数组容量。
步骤s214,该命中的特征字符串所属类别的命中特征串数各加1。
结果集中对匹配结果的分类,限定了不同种类的命中结果占用结果集中的命中记录数量,从而进一步降低了漏命中情况;而且由于结果集分类,有利于提高业务层对结果集的使用效率。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。