保存字符串匹配规则及利用保存规则进行字串匹配的方法

文档序号:7588121阅读:271来源:国知局
专利名称:保存字符串匹配规则及利用保存规则进行字串匹配的方法
技术领域
本发明涉及网络管理领域,尤其涉及网络中的字符串匹配问题。
背景技术
随着网络的发展和技术的进步,人们开始站在“内容”的角度,也就是从“应用层”的角度去看待网络,去管理和经营网络。“内容”网络的一个需要解决的重要问题就是对内容的识别。很多情况下,这一工作表现为对网络上传输的数据中的一些重要的字符串进行最长前缀匹配,并根据其所匹配的内容规则执行相应的动作。因此,字符串匹配作为计算机科学的基础问题,在网络不断发展的情况下,受到了日益广泛的关注,这方面的算法被层出不穷的提出,尤其是最长前缀匹配,由于其在路由查找等方面的重要作用,已经在业界获得了广泛的应用。
字符串匹配是将组成两个字符串的字符进行比较,判断两个字符串之间关系的操作,其中判别两字符串是否完全相等的操作被称为字符串的精确匹配。在字符串的精确匹配中,如果两字符串的长度相等,而且它们对应位置上的每一个字符都相同,就认为这两个字符串精确匹配成功,否则就认为精确匹配不成功。字符串精确匹配的操作通常用于在存有许多记录的信息库中查找某条特定信息。信息库中的每条记录通常有一个能唯一区分出各条记录的项称为关键字,记录中其它的信息称为记录的用户数据。查找的过程就是用某个要查找相关信息的字串S到信息库中与每条记录的关键字串进行精确匹配,从而找到关于串S的信息。在本发明中称关键字Key和此关键字对应的用户数据User_Data所组成的一个二元组为规则,记作R=(Key,User_Data)。通过如下实例,对字符串的最长前缀匹配加以说明,设有如表1所示的规则集合

表1其中,表1中的编号不是规则中的内容,只是为便于以下叙述而引入的。
假设有字符串S=aabegft,在这五条规则的五个关键字中,与S为最长前缀匹配关系的那个关键字K要满足下面的两个条件1、K是S的前缀,如本例中规则1、2、4的关键字。
2、在满足条件1的那些关键字中,K的长度是最长的;在本例中,规则4的关键字是S的最长前缀匹配,而不是1或2,虽然1和2也都是S的前缀,但是由于它们的长度没有4长,因此,与S不构成最长前缀匹配。
现结合两个具体实例,对现有技术中实现最长前缀匹配的方法加以描述现有技术一由于路由器在查找路由表时常需要用到最长前缀匹配,因此,最长前缀匹配在互联网中的用处很大。为了提高其速度,许多硬件厂商推出了能实现最长前缀匹配的网络处理芯片,这些网络处理器芯片都有各自的协处理器来实现字符或数字串的最长前缀匹配,其典型实现字符串前缀匹配的方法为1)匹配规则的组织先在内存中将规则构造成一种特殊的数据结构,这种结构是线性表+Patricia树+叶子的形式,此种形式被称为复合树,如图1所示。图中11为一个线性表,12、13和14为Patricia树,以该Patricia树作为中间节点,10、15、16、17、18和19为叶子节点,叶子节点中存有规则的关键字和规则的内容。在此树中保存匹配规则的过程为首先创建一棵空复合树,即在内存中为此结构的线性表、中间节点、叶子节点申请内存空间;然后将规则一条条地插入到这棵空树中,便形成了这种数据结构;然后,在这棵空树中插入规则,其插入规则的过程为将规则的关键字看成比特序列,取出其中的几个比特,如图1取的是前3比特,以其形成的值为索引,将关键字所在叶子的地址记在线性表中;在有多个关键字的这几个比特位都是相同从而导致冲突时,通过Patricia树来解决这一冲突;图中中间节点12、13、14形成了Patricia树,该节点12内的数字(4)、(6)指出此节点处的分支是因为关键字后续的哪一位不同而引起的,这样,冲突的关键字会因为后续比特位的不同而由Patricia树的不同分支区分开来,从而解决了冲突问题。
2)规则的匹配匹配时,待匹配字串S也被看成比特序列,先将其中的与前述关键字相应的几个比特取出,以这几位形成的数值作为索引到线性表中找到相应表项;再沿此表项引出的Patricia树搜索,便可以找到待匹配字串S的最长前缀匹配串。在树中寻找待匹配的串的最长前缀匹配串的过程,也可称为树的查找,或树的搜索。
在上述的现有技术一中,插入规则的过程由网络处理器提供的微码程序实现,而2)中所描述的匹配和搜索过程通过硬件实现,以此种方式,能够提高最长前缀匹配的速度;然而,现有技术一也具有相当的局限性,表现在由于网络处理器本身设计工艺及成本等方面的考虑,其对关键字的长度是有限制的,如4GS3的关键字最长是192比特,C-5的是112比特,这对于关键字较短的路由查找、较简单的流分类等应用场合已经足够,但对于内容网络设备所需要的几百字节(上千比特位)的内容规则的匹配则显得太短,很不够用。另外对于软件实现的方案,由于内存资源的限制,设计数据结构时,也需要对树的关键字长度有一定的限制。
现有技术二为了突破硬件本身的制约,实现对关键字长度超过限制的规则的匹配,一种较为直接的实现方式是将多棵复合树级联起来,构造成如图2所示的级联树,为了叙述方便,后文中将上述的复合树简称为树。
图2中20、21、22、23所表示的都是现有技术一中所述的树结构,不过其中某一级子树的叶子,如图2中的30、37等,指向下一级的子树,将它们连在一起形成了级联树。图2中假设每个树允许的关键字长度最大为L比特,Sa、Sb、Sw、Sp代表长度为L比特的字符或数字串,Se、Sf、Sr、St代表长度小于等于L比特的串。SaSb表示将Sa和Sb两个串连接起来所形成的关键字串,例如若Sa为0010,Sb为0101,则SaSb就表示00100101。以长度超过L比特的关键字串SaSbSe为例,现有技术二中,利用这种级联树保存字符串匹配规则的方法是1、将关键字按顺序分成多段子关键字,除最后一段子关键字外,各子关键字的长度为L,最后一段子关键字的长度等于或小于L,此例中将关键字串SaSbSe分成为Sa、Sb、Se三段;2、用现有技术一中的方法创建一棵空树20,作为第一级树;然后取出关键字第一段Sa,以Sa为关键字,将其用现有技术一中的插入方法插入到树20中,将其对应的叶子Sa30的用户数据中的级联标记31记为01,以表示级联,其它不级联的叶子相应位置处记为00,以表示不级联;3、创建一棵与现有技术一所描述的数据结构相同的空树21,同时从串SaSbSe中取出后续的L比特位Sb,以Sb为关键字,将其插入到第二级的树21中,生成叶子37,并在20中的叶子30中设置一个表示级联状态的指针32指向此树21;再取Se插入第三级复合树22的叶子33中,如此递推下去,直到关键字的所有比特都被取到,便构造好了最后一级复合树,如图2中的22,图中用一个″-″表示此树的叶子的级联状态指针为空,表示其不再有下一级子树。
现有技术二中,利用所构建的树进行匹配的方法为对于待匹配的串S,也依次取其0到L-1比特作为子关键字在第一级子树中匹配,找到叶子后,再沿叶子的级联指针到第二级子树中匹配下一段子关键字,如此递推直到扫描完整个S或在某棵子树中出现局部匹配失败。
由于是最长前缀匹配,在某棵子树中出现局部匹配失败时并不能认为整个的最长前缀匹配失败了,此时需要在以前所经过的子树的叶子中寻找可能的最长前缀匹配,这个过程称为回溯,回溯后才能知道是否真的失败了。为了便于实现回溯,在插入新的子关键字Knew时,若发现树中已有某子关键字Kold是Knew的最长前缀匹配,则在Knew的叶子中还要设置一个回溯指针指向Kold,这样在查找时,若匹配Knew成功而进行Knew下级任意一个子树匹配时失败,那么Kold就应该是最长前缀匹配的结果,于是用Knew的这个指针便能找到Kold,并以Kold作为最长前缀匹配的结果。若回溯前面所经过的叶子节点都不能找到最长前缀匹配,则表明对S的最长前缀匹配确实失败了。现有技术二中的级联结构的叶子节点的结构参见图3。
现有技术二利用现有技术一中的复合树作为结构单元,将超长的关键字分成多段分别插入到多棵复合树中,并将这些树级联起来形成级联树,便可在这种级联树的结构上完成对超长的字符串的规则匹配。但是,现有技术二需要用多棵树来实现级联树的构造,而且所需的树的数目由于依赖于处理的规则,因而是不确定的。对于网络处理器来说,其树的管理要占用一定的硬件资源,因此用户可用的树的数目是很有限的,如4GS3是128。这样现有技术二的处理能力就会很有限。

发明内容
有鉴于此,本发明的主要目的在于提供一种用于保存字符串匹配规则的方法,采用该方法能够将长字符串匹配规则或者超长字符串的匹配规则保存在规则树中,并且,采用该方法能够实现利用数目较少的规则树保存字符串匹配规则,以减少规则树所占据的硬件资源。
为实现上述目的,本发明所述的一种保存字符串匹配规则的方法,包括以下步骤步骤A以L-M为单位将当前待保存在规则树中的规则的关键字分为S段子关键字,其中,在所分得的S段子关键字中,除第S段子关键字之外的各段子关键字的长度均等于L-M,第S段子关键字的长度小于或等于L-M,L为规则树所保存规则中关键字的最长长度,M为叶子编号的长度,所分得的段数S为自然数;步骤B自第1段子关键字开始,到第S-1段子关键字为止,顺序执行步骤B1和步骤B2,其中,第1段子关键字的上一级叶子编号为0;步骤B1当前子关键字前串联上一级叶子的叶子编号,形成新的字串,判断规则树中是否已有以该新字串为关键字的叶子,如果没有,则在规则树中生成一个以该新字串为关键字的叶子,并为该新生成的叶子分配唯一的叶子编号,将该新生成叶子的级联标志置为级联,然后将该新生成叶子置为当前叶子;如果有,且该找到的叶子的级联标志为级联,则将该找到的叶子置为当前叶子;步骤B2将步骤B1中所处理的子关键字的下一段子关键字作为当前子关键字,将步骤B1中所处理的子关键字的叶子编号作为当前的上一级叶子编号,返回执行步骤B1;步骤C第S段子关键字前串联上一级叶子的叶子编号,形成新的字串,判断规则树中是否已有以该新字串为关键字的叶子,如果没有,则在规则树中生成一个以该新字串为关键字的叶子,然后将待保存规则中的数据内容写入该叶子,如果有,直接将待保存规则中的数据内容写入该叶子。
其中,步骤B1中所述判断规则树中是否已经有以所述字串为关键字的叶子包括以下步骤
步骤B11判断在规则树中是否有以所述字串的最长前缀匹配为关键字的叶子,如果没有,则判断得到规则树中没有以所述字串为关键字的叶子,如果有,则执行步骤B12;步骤B12判断步骤B11中找到的最长前缀匹配关键字是否与所述字串相同,如果不是,则判断得到规则树中没有以所述字串为关键字的叶子,如果是,则判断得到规则树中有以所述字串为关键字的叶子。
其中,步骤B12中,如果最长前缀匹配关键字与所述字串不同,该方法进一步包括将所述新生成的叶子的回溯指针指向该最长前缀匹配关键字所对应的叶子。
其中,步骤B1中,如果在规则树中找到的以所述字串为关键字的叶子不级联,所述将找到的叶子置为当前叶子进一步包括为所述找到的叶子分配唯一的叶子编号,将该找到的叶子置为级联,和将该找到的叶子的回溯指针指向其自身。
其中,步骤C中所述判断规则树中是否已经有以该字串为关键字的叶子包括以下步骤步骤C1判断在规则树中是否有以所述字串的最长前缀匹配为关键字的叶子,如果没有,则判断得到规则树中没有以该字串为关键字的叶子,如果有,则执行步骤C2;步骤C2判断步骤C1中找到的最长前缀匹配关键字是否与所述字串相同,如果不是,则判断得到规则树中没有以该字串为关键字的叶子,如果是,则判断得到规则树中有以该字串为关键字的叶子。
其中,步骤C中所述将规则的数据写入叶子为将规则中的数据写入叶子的“其它”域中。
其中,在步骤B1中和步骤C中,所述在规则树中新构建一个以所述字串为关键字的叶子进一步包括将该新构建叶子的上一级叶子中的“下级计数”域中的值加1。
其中,删除规则树中的一个规则时,该方法进一步包括步骤D1以L-M为单位将待删除的规则中的关键字分为T段子关键字;其中,在所分得的T段子关键字中,除第T段子关键字之外的各段子关键字的长度均等于L-M,第T段子关键字的长度小于或等于L-M,所分得的段数T为自然数;步骤D2自步骤D1的第1段子关键字开始,到第T-1段子关键字为止,顺序执行以下步骤D21~步骤D22,其中,第1段子关键字的上一级叶子编号为0步骤D21在当前子关键字前串联上一级叶子的叶子编号,形成新的字串,判断在规则树中能否找到以该字串为关键字的叶子,如果是,则执行步骤D22,否则,删除过程失败;步骤D22将在步骤D21中所找到的叶子节点记录在预先定义的数组中,以该叶子的叶子编号作为上一级叶子编号,以当前子关键字的下一级子关键字作为当前子关键字,返回步骤D21;步骤D3第T段子关键字前串联上一级叶子编号,形成新的字串,判断在规则树中能否找到其关键字与该新的字串完全相同的叶子,如果是,则将该叶子节点记录在步骤D22所述的数组中,然后执行步骤D4,否则,删除过程失败;步骤D4根据步骤D22中数组的记录,自该数组中所记录的待删除规则的最后一个叶子节点开始,到该待删除规则的第一个叶子节点为止,依次执行以下步骤判断当前处理的叶子的“下级计数”域是否为0,如果是,则删除该当前处理的叶子,并将该当前处理的叶子的上一级叶子的“下级计数”域的值减1,然后,将该上一级叶子置为当前处理的叶子,返回执行本步骤;否则,结束删除过程。
其中,如果当前处理的叶子为所述最后一个叶子节点,且该叶子的“下级计数”域不为0,该方法进一步包括删除该叶子节点中指向其自身的回溯指针。
本发明还提供了一种利用上述的字符串匹配规则树进行字符串匹配的方法,该方法将待匹配的字符串分为若干段子关键字,每段子关键字分别串联上一级叶子编号形成字串,在上述所构建的字符串匹配规则树中依次查找这些字串,从而实现字符串的匹配。
本发明的一种利用字符串匹配规则树进行字符串匹配的方法包括以下步骤步骤E以L-M为单位将待匹配的字符串分为P段子关键字,其中,在所分得的P段子关键字中,除第P段子关键字之外的各段子关键字的长度均等于L-M,第P段子关键字的长度小于或等于L-M,所分得的段数P为自然数;步骤F自第1段子关键字开始,到第P段子关键字为止,顺序执行以下步骤F1~步骤F2,其中,第1段子关键字的上一级叶子编号为0步骤F1当前子关键字前串联上一级叶子的叶子编号,形成新的字串,判断规则树中是否有以该字串为关键字的叶子,如果有,则执行步骤F2,否则,匹配失败;步骤F2判断在步骤F1所找到的叶子是否级联,如果是,则将该叶子的叶子编号作为上一级叶子编号,将当前子关键字的下一级子关键字作为当前子关键字,然后返回步骤F1,直至找到的叶子不级联;否则,该叶子为匹配结果的最后一级叶子,从该叶子中取出规则的数据,匹配结束。
其中,步骤F1中,如果规则树中有以该字串为关键字的叶子,该方法进一步包括将该叶子按照顺序记录在预先定义的数组中。
其中,步骤F1中,如果规则树中没有以该字串为关键字的叶子,该方法进一步包括
自所述数组记录的最后一个叶子节点开始,按顺序判断该数组所记录的叶子的回溯指针是否为空,如果是,则返回本步骤,直至判断得到所记录的所有叶子的回溯指针均为空,则匹配失败,否则,回溯指针所指向的叶子为匹配结果的最后一级叶子,从该叶子中取出规则的数据,匹配结束。
可见,本发明采用一棵规则树保存字符串匹配规则,将待保存的规则中的关键字分为若干段子关键字,这些子关键字与相应的叶子编号串联形成字串,在规则树中,以这些字串作为叶子的关键字,从而将待保存的规则分段插入到规则树中。在利用该规则树进行字符串匹配时,将待匹配的字符串分为若干段子关键字,每段子关键字分别串联上一级叶子编号形成字串,在上述的规则树中依次查找这些字串,从而实现字符串的匹配。
由于本发明中将待保存规则的关键字分为若干段插入规则树,因此,可以实现保存长字符串匹配规则或超长字符串匹配规则,进而可以利用该规则树实现长字符串或超长字符串匹配;由于在本发明中,采用一棵规则树保存字符串匹配规则,因此,减少了保存字符串匹配规则时的树的数量,从而节省了规则树所占用的硬件空间,使得该方法的处理能力得以提高,并拓宽了该方法的应用范围。


图1为现有技术中用于构建规则的复合树的结构示意图。
图2为现有技术中用于构建规则的级联树的结构示意图。
图3为现有技术中级联树的叶子结构示意图。
图4为本发明中的叶子结构的示意图。
图5为本发明中用于保存字符串匹配规则的树的结构示意图。
图6为本发明中将规则插入规则树的流程图。
图7为本发明中将规则从规则树中删除的流程图。
图8为本发明中利用规则树进行字符串匹配搜索的流程图。
具体实施例方式
本发明为一种保存字符串匹配规则的方法以及利用保存匹配规则的规则树进行字符串匹配的方法,在保存字符串匹配规则方面,该方法可以看作是对上述现有技术二的改进,为每级树要引出的新的子树的叶子赋予一个叶子编号N,该编号占M比特,在取当前处理的子关键字的后续L-M比特子关键字构造下一级子树时,物理上并不创建一棵新的子树,而是以N串联上该后续的L-M比特子关键字,形成新的字串,为该新的字串构造叶子,将该叶子插入规则树中,重复上述步骤,直至将规则中关键字的各段子关键字以及规则的内容均插入规则树中。采用此种方式在规则树中保存匹配规则,可以只构建一棵规则树,而无需构建其它的子树,从而达到逻辑上精简的效果;在为新的叶子分配叶子编号N时,该编号N为针对不同叶子的一个唯一编号,以此方式,即使在现有技术二中不同子树的叶子中的关键字可能相同,由于引出它们的叶子编号N不同,两者级联后所得到的新的关键字就不会相同,由此仍可以根据该关键字唯一标识出这一级的子关键字,同时,以N在前L-M比特子关键字在后的形式实现串联,还可以保证最长前缀匹配的结果的正确性。
下面结合附图对本发明保存字符串匹配规则的方法进行详细描述。
本发明采用如图4所示的叶子结构保存字符串匹配规则,在该叶子结构中,叶子的关键字是由两部分串联在一起形成的串,如图4中所示用+表示两部分之间的连接,前一部分是上一级叶子的叶子编号,后一部分是当前叶子所对应的子关键字,两者合在一起的长度不超过L比特;预先设定叶子编号占M(M<<L) 比特,对关键字进行分段时,以L-M比特为单位进行分段,以保证子关键字与叶子编号串联在一起的长度不超过L比特。在该叶子结构中,叶子的“级联标志”、“回溯指针”、“其它”这三个字段的含意同现有技术二所述的内容相同,不同的是去掉了现有技术二中的“下一级子树”域,增加了“叶子编号”和“下级计数”两个域,其中,“叶子编号”域所记录的内容为该叶子的唯一叶子编号,“下级计数”记录此叶子逻辑上所引出的下级叶子的数目,设置此域是为了删除规则时判断是否要删除该叶子节点。
在本发明保存字符串匹配规则的方法中,字符串匹配规则的保存是通过将规则一条条地插入树中进行的,下面结合一个具体实例,对本发明中的保存字符串匹配规则的方法加以详细描述。
在该实施例中,有规则(Key1,D1)、(Key2,D2)、(Key3,D3)需要保存,其中关键字Key1以L-M比特为单位分为三段子关键字S1、S2、S3;关键字Key2以L-M比特为单位分为两段子关键字S1、S4;关键字Key3以L-M比特为单位分为两段子关键字S2、S4;上述S1和S2的长度为L-M比特,S3和S4的长度小于L-M比特;将上述规则采用图4所示的叶子结构插入保存匹配规则的空树中,图5为插入这些规则后的树的结构,在图5中仅详细画出叶子部分,由于线性表与中间节点与本方案关系不大,只简单画出;将上述三个规则插入树的步骤包括步骤A首先插入规则(Key1,D1),具体包括步骤A1取出Key1的第一段子关键字S1;步骤A2以00串联上S1构成新的字串00+S1,在树中探索是否已经有以00+S1为关键字的叶子,由于在本发明实施例中,保存规则的树最初为空树,因此,本步骤中在树中必定找不到以00+S1为关键字的叶子,直接执行步骤A3;其中,在向树中每插入一个新的规则时,该规则的第一段子关键字的上一级叶子都被设置为空,并且将上一级叶子编号设置为00,因此在本步骤中,以00串联S1构成新的字串00+S1;步骤A3将00+S1插入树中,产生叶子521,叶子521中的用户数据部分中的各个值被初始化为0;其中,所述叶子的用户数据部分参见图4所示,后续步骤中新产生叶子时,均是首先将叶子的用户数据部分的各个值初始化为0;步骤A4由于Key1还有下一段子关键字S2,因此,叶子521的级联标志被标记为1,以表示叶子521还将与其它下级叶子级联,同时,为叶子521分配一个唯一的叶子编号01;步骤A5取出Key1的下一段子关键字S2,此时,上一级叶子为521,上一级叶子编号为01;步骤A6上一级叶子编号01串联子关键字S2构成新的字串01+S2,在树中搜索是否已经有以01+S2为关键字的叶子,由于本实施例中,树中此时还没有以01+S2为关键字的叶子,因此,直接执行步骤A7;步骤A7将01+S2插入树中,产生叶子522,将叶子522的用户数据部分的各个值初始化为0,将上一级叶子521中的“下级计数”域中的值加1,本实施例中,521的“下级计数”域中的值经过本步骤后由0变为1;步骤A8由于Key1还有下一段子关键字K3,因此,叶子522的级联标志被置为1,并为叶子522分配一个唯一的叶子编号02,以供后续步骤使用;步骤A9取出Key1的下一段子关键字S3,此时,上一级叶子为522,上一级叶子编号为02;步骤A10上一级叶子编号02串联上子关键字S3构成新的字串02+S3,在树中探索是否已经有以02+S3为关键字的叶子,由于本实施例中,树中此时还没有02+S3为关键字的叶子,因此,直接执行步骤A11;步骤A11将02+S3插入树中,产生叶子523,将叶子523的用户数据部分的各个值初始化为0,将上一级叶子522中的“下级计数”域中的值加1,本发明实施例中,522的“下级计数”域中的值经过本步骤后由0变为1;步骤A12由于此时Key1的各段子关键字已经取完,因此,不必再为叶子523分配叶子编号,只需将规则(Key1,D1)中的数据D1写入到叶子523的“其它”域中,以保存该规则中的数据内容,至此,规则(Key1,D1)插入完毕;步骤B插入规则(Key2,D2),具体包括步骤B1取出Key2的第一段子关键字S1,此时上一级叶子被设置为空,上一级叶子编号被设置为“00”;步骤B2上一级叶子编号00串联上第一段子关键字S1构成新的字串00+S1,在树中探索是否已经有以00+S1为关键字的叶子,由于本实施例中,步骤A已经在树中构造了以00+S1为关键字的叶子,因此,无需再次构造以00+S1为关键字的叶子,直接执行步骤B3;步骤B3取出Key2的第二段子关键字S4,此时,上一级叶子为00+S1所对应的叶子521,上一级叶子编号为叶子521的编号01;步骤B4上一级叶子编号01串联上当前子关键字S4构成新的字串01+S4,在树中探索是否已经有以01+S4为关键字的叶子,由于在本实施例中,此时还没有以01+S4为关键字的叶子,因此,执行步骤B5;步骤B5将01+S4插入树中,产生叶子524,将当前的上一级叶子521的“下级计数域”的值加1,经过本步骤后,叶子521的“下级计数域”的值由1变为2;步骤B6由于此时Key2的各段子关键字已经取完,因此,不必为叶子524再分配编号,只需将规则(Key2,D2)中的数据D2写入叶子524中的“其它”域中,以保存该规则中的内容,至此,规则(Key,D2)插入完毕;步骤C插入规则(Key3,D3),具体包括步骤C1取出Key3的第一段子关键字S2,此时上一级叶子被设置为空,上一级叶子编号被设置为“00”;步骤C2上一级叶子编号00串联当前子关键字S2构成新的字串00+S2,在树中探索是否已经有以00+S2为关键字的叶子,由于本实施例中,此时在树中还没有构造以00+S2为关键字的叶子,因此,执行步骤C3;
步骤C3将00+S2插入树中,产生叶子525;步骤C4由于Key3还有下一段子关键字S4,因此,叶子525的级联标志被标记为1以表示叶子525还将与其它下级叶子级联,同时,为叶子525分配一个唯一的叶子编号03;步骤C5取出Key3的下一段子关键字S4,此时,上一级叶子为525,上一级叶子编号为03;步骤C6上一级叶子编号03串联当前子关键字S4构成新的字串03+S4,在树中探索是否已经有以03+S4为关键字的叶子,由于在本实施例中,树中此时还没有以03+S4为关键字的叶子,因此,执行步骤C7;步骤C7将03+S4插入树中,产生叶子526,将叶子526的用户数据部分的各个值初始化为0,将上一级叶子525中的“下级计数”域中的值加1,本发明实施例中,525的“下级计数”域中的值经过本步骤后由0变为1;步骤C8由于此时Key3的各段子关键字已经取完,因此,不必再为叶子526分配编号,只需将规则(Key3,D3)中的数据D3写入到叶子526的“其它” 域中,以保存该规则中的内容,至此,规则(Key3,D3)插入完毕。
以上所述为规则(Key1,D1)、规则(Key2,D2)以及规则(Key3,D3)的保存过程,考虑到字符串匹配过程中可能出现的例如回溯等的问题,下面利用另一实施例,说明在考虑到例如回溯等各个方面问题的情况下,实现保存字符串匹配规则的过程。
假设采用规则树T保存字符串匹配规则,该规则树T的初始状态可以为空,也可以已经保存有一些其它的字符串匹配规则,在本实施例中,有规则(Key,Data)要通过插入到规则树T中来保存,关键字Key的长度为B比特,以L-M比特为单位将关键字Key分为多段子关键字,其中,L比特为图4所示的叶子结构中的“上一级叶子编号+本级子关键字”的最大长度,M为图4所示的叶子结构中的“叶子编号”所占长度,以L-M比特为单位对关键字进行分段的目的在于使得该关键字的各段子关键字与叶子编号连接在一起所构成的字串的长度不超过图4叶子结构中所规定的长度L;进行上述分段后,除最后一段子关键字外,Key的各段子关键字的长度都为L-M,最后一段的长度小于或等于L-M比特;以S表示分段数,如果B能够被(L-M)整除,则S=B/(L-M),如果B不能够被(L-M)整除,则S=[B/(L-M)+1],这里[]表示对其内部的数值取整数部分;根据上面所述的分段过程,将所得到的Key的S段子关键字分别记作K1,K2……KS-1,KS;参见图6,通过将字符串匹配规则插入规则树以保存字符串匹配规则的过程具体包括以下步骤步骤600设置循环变量i,初始化循环变量i=1,用该循环变量i表示关键字Key所分得的各个子关键字的序号;步骤601将所插入规则的第一段子关键字的上一级叶子的叶子编号置为0,并且,将所插入规则的第一段子关键字的上一级叶子置为空;本步骤的目的在于在向规则树T中每插入一个新的规则时,保证该规则的第一段子关键字的上一级叶子都被设置为空,并且上一级叶子编号为0;步骤602将上一级叶子标号连接上子关键字Ki,形成新的字串Nki;最初执行该步骤602时,Ki为K1,上一级叶子编号为0;在执行后续步骤的循环流程返回步骤602时,该上一级叶子编号和Ki发生相应变化;步骤603在已经构造的T树中查找Nki的最长前缀匹配,如果找到,则执行步骤611及后续步骤,否则,执行步骤604及后续步骤;步骤604~步骤607由于在T树中没有找到Nki,因此,将Nki插入T树中,得到叶子Nfi,为该叶子分配唯一的叶子编号NLi,并且将叶子Nfi标记为级联,然后,将上一级叶子的“下级计数”域中的值加1,该加1的步骤只在上一级叶子不为空时执行,在上一级叶子为空的情况下不执行;步骤608将NLi作为当前的上一级叶子编号,将Nfi作为当前的上一级叶子;
步骤609~步骤610将循环变量i加1,然后,判断循环变量i的当前值是否等于Key关键字的分段数目s,如果不是,说明对于Key关键字中各个子关键字的处理还没有完成,返回步骤602,继续处理Key关键字中的剩余子关键字;否则,表明当前处理的子关键字是Ks-1,只剩下最后一个子关键字Ks待处理,执行步骤621及后续步骤;步骤611由于在步骤603中,在T树中找到了Nki的最长前缀匹配,在本步骤中,将该找到的最长前缀匹配所对应的叶子设置为叶子OFi;步骤612判断叶子OFi的关键字是否与Nki相同,如果是,表明当前子关键字Ki在树T中所需构造的叶子已经在树T中构造了,该已经构造的叶子就是叶子OFi,则执行步骤618及后续步骤;如果不是,表明当前子关键字Ki在树T中所需构造的叶子在树T中还没有构造,则执行步骤613及后续步骤;步骤613~步骤615将Nki插入到树T中,得到以Nki为关键字的叶子Nfi,为该叶子分配唯一的叶子编号NLi,并且置叶子Nfi为“级联”;步骤616将叶子Nfi的回溯指针指向叶子OFi;本步骤中进行该设置的目的是为了便于回溯找到可能的最长前缀匹配,进行此种回溯指针设置的原因在于由于叶子Nfi中的关键字Nki与叶子OFi中的关键字不同,并且叶子OFi的关键字为Nki的最长前缀匹配,因此,OFi中关键字的长度肯定小于Nki中的关键字长度,也就是说,OFi的关键字的长度肯定小于L,由OFi的关键字长度小于L可以进而得到OFi的下一级肯定不再级联其它叶子,OFi必定是某个规则的最后一级叶子;根据叶子OFi的上述性质以及OFi中的关键字是Nki的最长前缀匹配这一特点,可以利用在步骤616中所设定的回溯指针查找得到可能的最长前缀匹配,具体为一旦叶子Nfi的下一级或下几级的叶子无法与待匹配的字符串匹配,则进行回溯查找,当回溯到叶子Nfi时,利用叶子Nfi上的回溯指针找到叶子OFi,由于叶子OFi中的关键字为叶子Nfi中关键字的最长前缀匹配且小于叶子Nfi中的关键字,并且由于OFi肯定为某一规则的最后一级叶子,因此,该OFi为最长前缀匹配结果;举例来说,下述情况下,需要利用回溯指针实现最长前缀匹配存在如下3个规则规则1A,B1;规则2A,B1B2,C,D;规则3A,B1B2,C,E,F;其中B1和B2的长度加起来等于L;在将规则2和规则3插入规则树的过程中,将会分别查找到字串01+B1B2的最长前缀匹配的叶子,该最长前缀匹配叶子为规则1中子关键字B1的所对应的叶子,按照上述步骤,规则2和规则3中对应B1B2的两个叶子的回溯指针分别指向规则1中子关键字B1所对应的叶子;假设待匹配的关键字为A,B1B2,C,E,K,那么其匹配过程会经过A、B1B2、C、E四段,最后到K时,在规则树中不能找到与K相匹配的叶子,于是判断子关键字E的叶子的回溯指针是否为空,判断得到该回溯指针是空的,则再判断上一级叶子的回溯指针是否为空,判断得到该子关键字C所对应的叶子的回溯指针也是空的,则再向前判断子关键字B1B2所对应的叶子的回溯指针是否为空,判断得到该叶子的回溯指针为指向子关键字B1所对应的叶子,因此,找到该待匹配字符串A,B1B2,C,E,K的最长前缀匹配结果是A,B1;对于利用回溯指针实现最长前缀匹配的具体实施例,还会在后续利用所构造的匹配规则树进行字符串最长前缀匹配的具体实施例中加以介绍;步骤617将上一级叶子的“下级计数”域中的值加1,然后执行步骤608,继续处理关键字Key的其它子关键字;步骤618~步骤619根据叶子OFi中的级联标志判断叶子OFi是否是级联的,如果是,表明叶子OFi作为规则的一部分已经被插入到树中,相应的,叶子OFi肯定已经被分配了唯一的叶子编号,因此,直接执行步骤620;如果不是,表明叶子OFi为某一规则的最后一级叶子,该叶子当前并没有同其它的下级叶子级联,相应的,该叶子没有被分配唯一的叶子编号,则为叶子OFi分配唯一的叶子编号OLi,将叶子OFi置为级联,并将叶子OFi的回溯指针指向自身,然后,执行步骤620;其中,本步骤中,将叶子OFi的回溯指针指向自身的原因是由于叶子OFi为某一规则的最后一级叶子,因此将该叶子的回溯指针指向自身,以使得在进行字符串匹配时能够利用回溯指针找到该最后一级叶子;步骤620将叶子OFi作为上一级叶子,将OFi的叶子编号作为上一级叶子编号,然后,执行步骤609,对关键字Key的其它子关键字进行处理;步骤621由于在步骤610中判断得到当前i的值为关键字Key的分段数s,因此,本步骤处理关键字Key的最后一个子关键字Ks将当前的上一级叶子标号连接上Ks,形成新的关键字Ke;步骤622判断在树T中是否能够找到其关键字是Ke的最长前缀匹配的叶子,如果是,执行步骤626及后续步骤,否则,执行步骤623及后续步骤;步骤623由于在树T中没有找到关键字是Ke的最长前缀匹配的叶子,因此,将Ke插入到树T中,得到以Ke为关键字的叶子Fke;步骤624~步骤625将当前的上一级叶子的下级计数加1,并将规则的数据部分Data写入叶子Fke的“其它”域中,以保存规则的具体内容,然后,结束该规则(Key,Data)的插入过程;步骤626由于在步骤622中,在树T中找到了Ke的最长前缀匹配,因此,本步骤中将该找到的最长前缀匹配所对应的叶子设置为叶子Nke;步骤627~步骤628判断叶子Nke的关键字是否是步骤621中所形成的子关键字Ke,如果是,表明在树T中已经构造了子关键字Ke的叶子Nke,将规则数据部分Data写入叶子Nke的“其它”域中,以保存规则的具体内容,然后,结束该规则(Key,Data)的插入过程;如果不是,表明在树T中还没有构造子关键字Ke的叶子,因此,执行步骤623~步骤625,直至结束规则(Key,Data)的插入过程。
对于规则集中的各个规则,采用上述实施例所述的方法分别插入树中即可,最终可以得到一棵可以对长度超过L的字符串进行最长前缀匹配的树。
在本发明实施例中,在插入规则(Key,Data)时,采用循环变量i作为插入该规则时的标号,在有多条规则需要插入规则树时,可采用如下方法实现标号的唯一性将编号与一系列的比特位一一映射,通过该映射关系可以得到哪些编号用了,哪些编号还未曾使用,从而可以实现分配和回收这些编号,对于最多有Rm条规则且每条规则中的关键字Key的最长为Lm的情况,最多只需要Rm*Lm/L个编号即可。
由于匹配规则可能发生变化,需要根据该变化对已经构建的规则树中的规则进行删除,因此,本发明提供了规则删除的方法,该方法利用精确匹配,在规则树中查找要被删除的规则,然后删除,参见图7所示,其具体实现步骤包括步骤701将需要被删除的规则的关键字以L-M为单位分为多段子关键字,其分段方法与上述通过规则树保存字符串匹配规则时的分段方法相同;步骤702将第一段子关键字的上一级叶子置为空,将该上一级叶子的叶子编号置为0;步骤703自步骤701所分得的第一段子关键字开始,至倒数第二段子关键字为止,在规则树中查找各段子关键字所对应的叶子,并将找到的叶子节点记录在预先定义的数组中,具体依次执行以下步骤7031~步骤7032步骤7031当前的上一级叶子编号串联上当前的子关键字,构成新的字串,在规则树中查找关键字为该字串的最长前缀匹配的叶子,如果找到,则执行步骤7032;否则,删除规则失败,结束删除过程;步骤7032将在步骤7031中所找到的叶子记录在预先定义的数组B中,该数组B用于保存所经过的叶子节点,将该叶子的叶子编号作为上一级叶子编号,将当前处理的子关键字的下一级子关键字作为当前子关键字,返回步骤7031,直至处理完所述的倒数第二段子关键字;步骤704在规则树中查找到最后一段子关键字所对应的叶子,将找到的叶子节点记录在数组B中,具体为最后一段子关键字前串联上一级叶子编号,形成新的字串,在规则树中查找关键字与新的字串完全相同的叶子,如果找到,则将该叶子节点记录在步骤7032所述的数组B中,否则,删除过程失败;步骤705找到数组B中所记录的最后一个叶子节点,判断该节点的“下级计数”域是否为0,如果是,表明该节点的下一级不再有其它的叶子与之相连,执行步骤706;否则,表明该节点的下一级还有其它规则的叶子与之相连,执行步骤708;步骤706删除当前所处理的叶子节点,然后根据数组B中的记录,找到该叶子节点的上一级叶子节点,以该上一级叶子节点作为当前处理的叶子节点,将该当前处理的叶子节点的“下级计数”域的值减1,然后执行步骤707;步骤707判断当前处理的叶子节点的“下级计数”域的值是否为0,如果是,则返回步骤706,直至当前处理的叶子节点的“下级计数”的值不为0;否则,结束删除规则的过程;步骤708只删除该叶子“其它”域中所保存的数据,并且删除该叶子中指向其自身的回溯指针,保留该叶子节点,然后,结束删除规则的过程。
本发明还提供了一种利用上述的字符串匹配规则树进行字符串最长前缀匹配的方法,该方法将待匹配的字符串分为若干段子关键字,各段子关键字前分别串联相应的叶子编号,构成新的字串,利用该新的字串在规则树中进行匹配查找。
下面结合附图,对本发明中利用规则树进行字符串最长前缀匹配的方法进行详细描述。
参见图8,本发明实现利用规则树进行字符串最长前缀匹配需要以下步骤步骤801将待匹配的字符串以L-M为单位分为多段子关键字,其分段方法与上述保存字符串匹配规则时的分段方法相同;步骤802将第一段子关键字的上一级叶子置为空,将该上一级叶子的叶子编号置为0;步骤803~步骤804将当前的上一级叶子编号串联上当前的子关键字,构成新的字串,判断在规则树中是否能够查找关键字为该字串的最长前缀匹配的叶子,如果找到,则执行步骤805,直至处理完步骤801分段所得到的所有子关键字;否则,执行步骤808;步骤805~步骤807判断在步骤804中所找到的叶子是否级联,如果是,表明该叶子并不是匹配规则的最后一个叶子节点,则将该叶子节点记录在预先定义的数组A中,该数组用以保存匹配过程中所经过的叶子节点,然后,以该找到的叶子的编号作为当前的上一级叶子编号,以当前的子关键字的下一级子关键字作为当前关键字,返回步骤803;否则,表明该找到的叶子为满足最长前缀匹配要求的字符串匹配规则的最后一级叶子,从该叶子的“其它”域中取出该规则的数据,结束匹配过程;步骤808~步骤810根据搜索过程中在数组A中所保存的已经经过的叶子节点,找到当前叶子节点的上一级叶子节点,判断该叶子节点中的“回溯指针”域是否为空,如果为空,则返回步骤808,直至当前叶子的上一级叶子节点中的“回溯指针”域不为空,如果不为空,则根据上述已经介绍的回溯指针所指向的叶子的性质,当前叶子的上一级叶子节点中的“回溯指针”域所指向的叶子就是待匹配字符串的最长前缀匹配,从该叶子的“其它”域中取出规则的数据,然后,结束搜索过程;其中,如果在已经经过的所有叶子节点中都不能找到“回溯指针”域不为空的叶子,则表明在规则树中无法找到待匹配的字符串的最长前缀匹配规则,最长前缀匹配失败,结束搜索过程。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
权利要求
1.一种保存字符串匹配规则的方法,其特征在于,该方法包括以下步骤步骤A以L-M为单位将当前待保存在规则树中的规则的关键字分为S段子关键字,其中,在所分得的S段子关键字中,除第S段子关键字之外的各段子关键字的长度均等于L-M,第S段子关键字的长度小于或等于L-M,L为规则树所保存规则中关键字的最长长度,M为叶子编号的长度,所分得的段数S为自然数;步骤B自第1段子关键字开始,到第S-1段子关键字为止,顺序执行步骤B1和步骤B2,其中,第1段子关键字的上一级叶子编号为0;步骤B1当前子关键字前串联上一级叶子的叶子编号,形成新的字串,判断规则树中是否已有以该新字串为关键字的叶子,如果没有,则在规则树中生成一个以该新字串为关键字的叶子,并为该新生成的叶子分配唯一的叶子编号,将该新生成叶子的级联标志置为级联,然后将该新生成叶子置为当前叶子;如果有,且该找到的叶子的级联标志为级联,则将该找到的叶子置为当前叶子;步骤B2将步骤B1中所处理的子关键字的下一段子关键字作为当前子关键字,将步骤B1中所处理的子关键字的叶子编号作为当前的上一级叶子编号,返回执行步骤B1;步骤C第S段子关键字前串联上一级叶子的叶子编号,形成新的字串,判断规则树中是否已有以该新字串为关键字的叶子,如果没有,则在规则树中生成一个以该新字串为关键字的叶子,然后将待保存规则中的数据内容写入该叶子,如果有,直接将待保存规则中的数据内容写入该叶子。
2.根据权利要求1所述的方法,其特征在于,步骤B1中所述判断规则树中是否已经有以所述字串为关键字的叶子包括以下步骤步骤B11判断在规则树中是否有以所述字串的最长前缀匹配为关键字的叶子,如果没有,则判断得到规则树中没有以所述字串为关键字的叶子,如果有,则执行步骤B12;步骤B12判断步骤B11中找到的最长前缀匹配关键字是否与所述字串相同,如果不是,则判断得到规则树中没有以所述字串为关键字的叶子,如果是,则判断得到规则树中有以所述字串为关键字的叶子。
3.根据权利要求2所述的方法,其特征在于,步骤B12中,如果最长前缀匹配关键字与所述字串不同,该方法进一步包括将所述新生成的叶子的回溯指针指向该最长前缀匹配关键字所对应的叶子。
4.根据权利要求1所述的方法,其特征在于,步骤B1中,如果在规则树中找到的以所述字串为关键字的叶子不级联,所述将找到的叶子置为当前叶子进一步包括为所述找到的叶子分配唯一的叶子编号,将该找到的叶子置为级联,和将该找到的叶子的回溯指针指向其自身。
5.根据权利要求1所述的方法,其特征在于,步骤C中所述判断规则树中是否已经有以该字串为关键字的叶子包括以下步骤步骤C1判断在规则树中是否有以所述字串的最长前缀匹配为关键字的叶子,如果没有,则判断得到规则树中没有以该字串为关键字的叶子,如果有,则执行步骤C2;步骤C2判断步骤C1中找到的最长前缀匹配关键字是否与所述字串相同,如果不是,则判断得到规则树中没有以该字串为关键字的叶子,如果是,则判断得到规则树中有以该字串为关键字的叶子。
6.根据权利要求1所述的方法,其特征在于,步骤C中所述将规则的数据写入叶子为将规则中的数据写入叶子的“其它”域中。
7.根据权利要求1所述的方法,其特征在于,在步骤B1中和步骤C中,所述在规则树中新构建一个以所述字串为关键字的叶子进一步包括将该新构建叶子的上一级叶子中的“下级计数”域中的值加1。
8.根据权利要求7所述的方法,其特征在于,删除规则树中的一个规则时,该方法进一步包括步骤D1以L-M为单位将待删除的规则中的关键字分为T段子关键字;其中,在所分得的T段子关键字中,除第T段子关键字之外的各段子关键字的长度均等于L-M,第T段子关键字的长度小于或等于L-M,所分得的段数T为自然数;步骤D2自步骤D1的第1段子关键字开始,到第T-1段子关键字为止,顺序执行以下步骤D21~步骤D22,其中,第1段子关键字的上一级叶子编号为0步骤D21在当前子关键字前串联上一级叶子的叶子编号,形成新的字串,判断在规则树中能否找到以该字串为关键字的叶子,如果是,则执行步骤D22,否则,删除过程失败;步骤D22将在步骤D21中所找到的叶子节点记录在预先定义的数组中,以该叶子的叶子编号作为上一级叶子编号,以当前子关键字的下一级子关键字作为当前子关键字,返回步骤D21;步骤D3第T段子关键字前串联上一级叶子编号,形成新的字串,判断在规则树中能否找到其关键字与该新的字串完全相同的叶子,如果是,则将该叶子节点记录在步骤D22所述的数组中,然后执行步骤D4,否则,删除过程失败;步骤D4根据步骤D22中数组的记录,自该数组中所记录的待删除规则的最后一个叶子节点开始,到该待删除规则的第一个叶子节点为止,依次执行以下步骤判断当前处理的叶子的“下级计数”域是否为0,如果是,则删除该当前处理的叶子,并将该当前处理的叶子的上一级叶子的“下级计数”域的值减1,然后,将该上一级叶子置为当前处理的叶子,返回执行本步骤;否则,结束删除过程。
9.根据权利要求8所述的方法,其特征在于,如果当前处理的叶子为所述最后一个叶子节点,且该叶子的“下级计数”域不为0,该方法进一步包括删除该叶子节点中指向其自身的回溯指针。
10.一种利用字符串匹配规则树进行字符串匹配的方法,其特征在于,该方法包括以下步骤步骤E以L-M为单位将待匹配的字符串分为P段子关键字,其中,在所分得的P段子关键字中,除第P段子关键字之外的各段子关键字的长度均等于L-M,第P段子关键字的长度小于或等于L-M,所分得的段数P为自然数;步骤F自第1段子关键字开始,到第P段子关键字为止,顺序执行以下步骤F1~步骤F2,其中,第1段子关键字的上一级叶子编号为0步骤F1当前子关键字前串联上一级叶子的叶子编号,形成新的字串,判断规则树中是否有以该字串为关键字的叶子,如果有,则执行步骤F2,否则,匹配失败;步骤F2判断在步骤F1所找到的叶子是否级联,如果是,则将该叶子的叶子编号作为上一级叶子编号,将当前子关键字的下一级子关键字作为当前子关键字,然后返回步骤F1,直至找到的叶子不级联;否则,该叶子为匹配结果的最后一级叶子,从该叶子中取出规则的数据,匹配结束。
11.根据权利要求10所述的方法,其特征在于,步骤F1中,如果规则树中有以该字串为关键字的叶子,该方法进一步包括将该叶子按照顺序记录在数组中。
12.根据权利要求11所述的方法,其特征在于,步骤F1中,如果规则树中没有以该字串为关键字的叶子,该方法进一步包括自所述数组记录的最后一个叶子节点开始,按顺序判断该数组所记录的叶子的回溯指针是否为空,如果是,则返回本步骤,直至判断得到所记录的所有叶子的回溯指针均为空,则匹配失败,否则,回溯指针所指向的叶子为匹配结果的最后一级叶子,从该叶子中取出规则的数据,匹配结束。
全文摘要
本发明公开了一种保存字符串匹配规则的方法,该方法将待保存的规则的关键字分为若干段子关键字,各段子关键字分别与相应的叶子编号串联形成字串,然后,以该字串为关键字在规则树中构建叶子,从而将规则的关键字以及规则的数据部分插入规则树中保存;本发明还公开了一种利用规则树进行字符串匹配的方法,该方法将待匹配的字符串分为若干段子关键字,各段子关键字与相应的叶子编号串联形成字串,在上述的规则树中查找这些字串的最长前缀匹配,从而实现字符串的匹配过程。该方法能够实现保存长字符串匹配规则,并且由于在利用规则树保存规则时不需要子树,因此可以减少硬件资源的占用,提高处理能力。
文档编号H04L29/00GK1652534SQ200410001099
公开日2005年8月10日 申请日期2004年2月3日 优先权日2004年2月3日
发明者肖斌 申请人:华为技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1