CN1253817C - 一种实现长字符串前缀匹配的方法 - Google Patents

一种实现长字符串前缀匹配的方法 Download PDF

Info

Publication number
CN1253817C
CN1253817C CN 02129945 CN02129945A CN1253817C CN 1253817 C CN1253817 C CN 1253817C CN 02129945 CN02129945 CN 02129945 CN 02129945 A CN02129945 A CN 02129945A CN 1253817 C CN1253817 C CN 1253817C
Authority
CN
China
Prior art keywords
key word
tree
length
leaf
sub
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
CN 02129945
Other languages
English (en)
Other versions
CN1477559A (zh
Inventor
肖斌
熊鹰
齐欣
张光明
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Huawei Technologies Co Ltd
Original Assignee
Huawei Technologies Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Huawei Technologies Co Ltd filed Critical Huawei Technologies Co Ltd
Priority to CN 02129945 priority Critical patent/CN1253817C/zh
Publication of CN1477559A publication Critical patent/CN1477559A/zh
Application granted granted Critical
Publication of CN1253817C publication Critical patent/CN1253817C/zh
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Landscapes

  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明属于计算机网络的数据传输技术领域,涉及一种实现长字符串前缀匹配的方法,包括:采用多个能实现有限长度为L的字符串的最长前缀匹配的数据结构作为结构单元;将用于匹配的每一条规则中的关键字按顺序分成多个长度为L的子关键字,将每个子关键字分别插入到所说的各个结构单元中,并将各个结构单元级联在一起形成级联数据结构;将待匹配的字符串按长度为L分成多段子串,依次将每段子串与所说的级联数据结构的每个单元中的子关键字逐级进行匹配,得到待匹配字符串的最长前缀匹配结果。本发明突破了原结构中对关键字长度的限制,同时本发明仍然保留了现有方法利用了硬件快速查找的能力。

Description

一种实现长字符串前缀匹配的方法
技术领域
本发明属于计算机网络的数据传输技术领域,特别涉及实现字符串最长前缀匹配的方法。
背景技术
随着网络的发展和技术的进步,人们开始站在“内容”的角度,也就是说“应用层”的角度去看待网络,去管理和经营网络。“内容”网络的一个需要解决的重要问题就是对内容的识别。很多情况下,这一工作表现为:对网络上传输的数据中的一些重要的字符串进行最长前缀匹配,并根据其所匹配的内容规则执行相应的动作。
字符串匹配作为计算机科学的基础问题,受到了广泛的关注,这方面的算法也层出不穷。尤其是最长前缀匹配,由于其在路由查找等方面的重要作用,已经在业界获得了广泛的应用。
字符串匹配是将组成两个字符串的字符进行比较,判断两个字符串之间的关系的操作。其中判别两字符串是否完全相等的操作称为字符串的精确匹配。如果两字符串的长度相等,而且它们对应位置上的每一个字符都相同,就认为这两个字符串精确匹配成功,否则就认为精确匹配不成功。
精确匹配的操作通常用于在存有许多记录的信息库中查找某条特定信息。信息库中的每条记录通常有一个能唯一区分出各条记录的项称为关键字,记录中其它的信息称为记录的用户数据。查找的过程就是用某个要查找相关信息的字串S到信息库中与每条记录的关键字串进行精确匹配,从而找到关于串S的信息。在本发明中称关键字Key和此关键字对应的用户数据User_Data所组成的一个二元组为规则,记作R=(Key,User_Data)。
对于最长前缀匹配,通过例子说明如下。设有如表1所示的规则集合:
编号    关键字    用户数据
1       aa        Data1
2       aab       Data2
3       aabd      Data3
4       aabe      Data4
5       aabef     Data5
(注,其中编号不是规则中的内容,只是为便于以下叙述而引入的。)
那么对于字符串S=aabegft,在这五条规则的五个关键字中,是S的最长前缀匹配的那个关键字K要满足下面的两个条件:
1、K是S的前缀,如本例中就是规则1、2、4的关键字。
2、在满足条件1的那些关键字中,K的长度是最长的。于是本例中就是规则4的关键字是S的最长前缀匹配,而不是1或2,虽然1和2也都是S的前缀,但是它们的长度没有4长。
最长前缀匹配在互联网中用处很大,路由器在查找路由表时就要用到最长前缀匹配。为了提高其速度,一些硬件厂商还推出了能实现最长前缀匹配的芯片,如IBM的NP 4GS3[NP 2002],Motorola的C-5[C52001]等网络处理器芯片,都有各自的协处器来实现字符或数字串的最长前缀匹配。一种典型的实现字符串前缀匹配的方法为:
1)树的构造:
(1)先在内存中将规则构造成一种特殊的数据结构,这种结构是线性表+Patricia树(或Trie树)+叶子的形式,[C52001]中称其为复合树,如图1所示。图中11为一个线性表,12、13和14为中间节点(Patricia树),10、15、16、17、18和19为叶子节点,叶子节点中存有规则的关键字和规则的内容。构造此结构的过程是这样的:首先创建一棵空树,即在内存中为此结构的线性表、中间节点、叶子节点申请内存空间。
(2)然后将规则一条条地插入到这棵空树中,便形成了这种数据结构。其插入规则的过程是这样的:将规则的关键字看成比特序列,取出其中的几个比特(如图1取的是前3比特),以其形成的值为索引,将关键字所在叶子的地址记在线性表中。若发生冲突,即有多个关键字的这几个比特位都是相同的,则要通过Patricia树来解决这一冲突。图中中间节点12、13、14便形成了Patricia树,该节点12内的数字(4),(6)指出此节点处的分枝是因为关键字后续的哪一位不同而引起的。这样,冲突的关键字也会因为后续的比特位的不同而由Patricia树的不同分枝区分开来。
2)匹配时,待匹配字串S也被看成比特序列,先将其中的与前述关键字相应的几个比特取出,以这几位形成的数值作为索引到线性表中找到相应表项;
3)再沿此表项引出的Patricia树搜索,便可以找到待匹配字串S的最长前缀匹配串。
4)由于在使用中,规则集合是会发生变化的,所以传统方法还包括对规则的删除操作。
上述传统方实现字符串前缀匹配的方法的特点概括如下:
1、该方法的叶子中主要包括关键字Key,用户数据User_Data这两个字段。
2、该方法可以实现如下操作:
在树Tree中插入规则R=(Key,User_Data)的操作。此操作能返回插入R后,R在Tree中所对应的叶子节点Leaf(Key)。若Tree中已存有关键字值相同的规则R0=(Key,User_Data0),则此操作不产生新的叶子节点,而只会找到此叶子,并用新的User_Data替换原叶子中的User_Data0。此操作表示为函数Trd_Insert(Tree,Key,User_Data);
在Tree中删除(Key,User_Data)的操作。表示为Trd_Delete(Tree,Key);
在Tree中搜索串S的最长前缀匹配的操作,表示为Trd_Search(Tree,S)。且如果在Tree中有S的最长前缀匹配串Key,则此操作能返回此Key对应的叶子(非空),否则返回为空。
可以对树中的叶子数进行计数,以判断一棵树是否为空。
3、由于上述方法中2)、3)步骤中所描述的搜索过程是通过硬件实现的,大大提高了最长前缀匹配的速度。
4、然而,这种硬件的实现方式也有一定的局限性:由于硬件本身设计工艺及成本等方面的考虑,其对关键字的长度都是有限制的,如4GS3的关键字最长是(192)比特,C-5的是(112)比特。这对于关键字较短的路由查找、较简单的流分类等应用场合已经足够,但对于内容网络设备所迫切需要的几百字节(上千比特位)的内容规则的匹配则显得太短了,很不够用。另外对于软件实现的方案,由于内存资源的限制,设计数据结构时,也需要对树的关键字长度有一定的限制。
除上述方法采用的线性表+Patricia树(或Trie树)+叶子的数据结构形式外,能实现字符串的最长前缀匹配的数据结构还有一些其它形式,例如直接采用Patricia树(或Trie树)的结构,但目前已有的数据结构只能对有限长度的字符串实现最长前缀匹配,因而其应用受到局限。
发明内容
本发明的目的是为克服已有技术的不足之处,提出一种实现长字符串前缀匹配的方法,利用已有的数据结构,在传统的对有限长度的字符串实现最长前缀匹配方法的基础上,既利用了硬件快速查找的能力,又突破了其本身对关键字长度的限制。实现了更长字符串的最长前缀匹配,且有利于用软件实现,可广泛应用在各种内容网络设备的数据传输上。
本发明提出的一种实现长字符串前缀匹配的方法,其特征在于,包括以下步骤:
1)采用多个能实现有限长度为L的字符串的最长前缀匹配的数据结构作为结构单元;
2)将用于匹配的每一条规则中的关键字按顺序分成多个子关键字,除最后一个子关键字外,各子关键字的长度为L,最后一个子关键字的长度等于或小于L;
3)将每个子关键字分别插入到所说的各个结构单元中,并将各个结构单元级联在一起形成级联数据结构;
4)将待匹配的字符串按长度为L分成多段子串,除最后一段外,每段长度为L,最后一段的长度等于或小于L;
5)依次将每段子串与所说的级联数据结构的每个单元中的子关键字逐级进行匹配,得到待匹配字符串的最长前缀匹配结果。
本发明所说的步骤1)中的数据结构可采用由线性表+Patracia树+叶子组成的复合树,该叶子中有存贮用户数据的空间。
本发明还可采用其它的能实现有限长度为L的字符串的最长前缀匹配的数据结构作为结构单元。
本发明所说的步骤3)中将各个结构单元级联在一起的方法可为:将某一级结构单元的叶子中所说的用户数据空间中设置一个表示级联状态的标志,并在该空间中设置一个指向下一级子树的指针,以及设置一个指向回溯叶子的指针。
本发明的上述方法还可包括:
6)根据用户需要,删除以某字符串为关键字的相应规则,其方法具体可包括以下步骤:
(1)先将用户所给出的字符串按长度为L分成多段子串,除最后一段外,每段长度为L,最后一段的长度等于或小于L;
(2)依次将每段子串与所说的级联结构中的每个结构单元中的子关键字逐级进行精确匹配,得到待匹配字符串的精确匹配结果;
(3)从所说的匹配过程所经过的结构单元中的最后一级子树开始逐级向前删除子关键字,如果删除某子关键字后其原来所在的子树不为空,则停止删除操作。
本发明方法的实现原理说明如下:
为便于理解,本发明的结构单元采用由线性表+Patracia树+叶子组成的复合树,设复合树所能允许的最长的关键字长度为L比特,对于长度超过L的关键字集合,构造成本发明的级联复合树,如图2所示:其中,Sa,Sb,Se,Sf,Sw,Sr,St,Sp等均代表长度为L比特的字符或数字的关键字串。SaSb表示将Sa和Sb两个串连接起来所形成的关键字串。例如:若Sa为0010,Sb为0101,则SaSb就表示00100101。图中的叶子33、34、35、36所存贮的规则的关键字分别是SaSbSe、SaSbSf、SwSr、SwSt,它们的长度都超过了L比特。这里以关键字SaSbSe为例说明本发明的实现步骤:首先用传统方法创建一棵与传统方法的数据结构相同的空复合树20,作为第一级复合树;然后从串SaSbSe中取出前L比特位,这时即为Sa,以Sa为关键字,将其用传统方法插入到复合树20中,在其对应的叶子Sa30的用户数据中做一个级联标记(01)31,其它不级联的叶子相应位置处为(00),表示不级联。
然后再用传统方法创建一棵与传统方法的数据结构相同的空复合树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的最长前缀匹配确实失败了。
若需要删除某条规则时,用户要给出所希望删除的规则的关键字(为便于叙述将其记作Kdel),本方法先将Kdel胺L比特长分为多段,逐级到级联树的各级子树中匹配,找到与Kdel精确匹配的叶子,若没能找到与Kdel精确匹配的叶子,则不删除;若找到了,则用传统的方法在最后一级子树中删除这个叶子,若删除此叶子后,此叶子所在的子树变成了一棵空树,则还要向上在上一级子树中删除级联着这棵子树的那个叶子,如此类推;若删除了某叶子后,此叶子所在的子树仍不是一棵空树,整个删除过程便可以结束了。
本发明的特点及效果:
本发明在关键字长度较短的复合树的基础上,解决了在内容网络设备中实现长字符串的最长前缀匹配这一问题。是对现有的树结构的改进。这种改进使得现有的这种树结构可以形成级联,从而实现对更长字符串的最长前缀匹配,突破了原结构中对关键字长度的限制,同时本发明仍然保留了现有方法利用了硬件快速查找的能力。
附图说明
图1为已有的实现最长字符串前缀匹配的树的结构示意图。
图2为本发明级联树的结构示意图。
图3a为本发明的规则插入方法实施例流程框图之1。
图3b为本发明的规则插入方法实施例流程框图之2。
图4为本发明的匹配方法的实施例流程图。
图5为本发明的删除规则的实施例流程图。
具体实施方式
本发明提出的一种实现长字符串前缀匹配的方法结合附图及实施例详细说明如下:
本发明提出的一种实现长字符串前缀匹配的方法,包括以下步骤:
1)采用多个能实现有限长度为L的字符串的最长前缀匹配的数据结构作为结构单元;
2)将用于匹配的每一条规则中的关键字按顺序分成多个子关键字,除最后一个子关键字外,各子关键字的长度为L,最后一个子关键字的长度等于或小于L;
3)将每个子关键字分别插入到所说的各个结构单元中,并将各个结构单元级联在一起形成级联数据结构;
4)将待匹配的字符串按长度为L分成多段子串,除最后一段外,每段长度为L,最后一段的长度等于或小于L;
5)依次将每段子串与所说的级联数据结构的每个单元中的子关键字逐级进行匹配,得到待匹配字符串的最长前缀匹配结果。
在上述五步的基础上,还可包括;
6)根据用户需要,删除以某字符串为关键字的相应规则。
本发明的上述方法结合附图及实施例进一步详细说明如下:
本实施例中的结构单元采用多个由线性表+Patracia树+叶子组成的复合树作为子树,将多个子树组构成本发明的级联复合树,结合图2说明如下:
a)在上述复合树叶子的用户数据空间中设置一个标志,如图2中(01)31,为便于叙述将其记作Cascade_flag,用于表示级联树的叶子的级联情况:
b)在用户数据中设置一个指向下一级子树的指针,如图2中32,(记作Next_tree)和一个回溯指针(记作Back_ptr)(图中未示出)。其它的位置仍留给用户数据使用。
本实施例的级联树的叶子有如下的三种类型:
a)最终的叶子节点:这种叶子节点不再级联下一级子树,即Next_tree指针为空。它是匹配操作最终要找的节点,其中存有用户数据。如图2中的33、34、35、36、38。
b)仅做为级联用的叶子节点:这种叶子节点级联有下一级子树,即Next_tree指针不为空,但它不记录用户数据。它只是匹配操作过程中需要搜索的中间节点(以下称其为中间叶子节点)。
c)既级联又存有用户数据的叶子节点:这种叶子节点既级联有下一级子树,又记录有用户数据。它可能是某次匹配操作过程中需要搜索的中间节点,也可能是另外的某次匹配操作最终要找的叶子节点。例如图2中的叶子节点37,如果树中只插入了一条规则R1=(SaSbSe,User_data1),即关键字串SaSbSe与用户数据1的组合,则它就只是一个b)类的叶子节点。如果再插入规则R2=(SaSb,User_data2),即关键字串SaSb与用户数据2的组合,则节点37就成为了c)类叶子节点,此时它既存有R2的用户数据User_data2,又级联着叶子33所在的子树32。
Cascade_Flag标志的设置就是为了区分这三种情况。本实施例分别用Cascade_Flag标志等于0、1、2来表示a)、b)、c)这三类叶子节点。
本实施例的构造级联树的方法包括:
首先创建一棵空树Tree,然后按下面所述的插入方法将规则一条一条地插入(InsertRule)到这棵树Tree中,当所有的规则都插入到Tree中后就会形成关于此规则集合的级联树。其主要步骤如下:将关键字Key以L比特为单位,分成多段子关键字,将它们分别插入各级子树。不过前面的几段子关键字和最后一段的处理不太一样:前面几段要充当级联节点,最后一段要充当最终的叶子节点。
本实施例插入一条规则及级联的具体方法如图3所示,其中,图3a描述的就是前面几段的处理,图3b描述的是对最后一段的处理。包括以下步骤:300、在树Tree中插入规则(K,UD)的函数InsertRule(Tree,Key,Userdate)入口传入三个参数Tree,Key,Userdata(分别简记为T、K和UD),其中,Tree表示在哪棵树中插入,Key是要插入的规则的关键字,Userdata是要插入的规则的用户数据;
301、取得关键字K的总长度,并将此值赋给变量Total_Len(简记为TL);
302、然后判断总长度TL是否为0,为0则转370返回,否则转(303)继续处理;
303、对以下变量进行初始化,其中:
将记录目前扫描过的关键字K的比特位数的变量Scaned_Len(SL)置为0,
将记录剩余的未被扫描到的比特位数的变量Remained_Len(RL)置为TL,
将记录当前所要插入的树的变量Cur_Tree(CT)置为T;
304、判断是否RL<=L,若是,则表示前面各段已处理完了,只剩最后一段了,这时就转350,否则进行下一步305继续处理;
305、从关键字的第SL比特位开始取L比特,形成子关键字Sub_Key(SK);
306、在当前树CT中用传统的Trd_Search操作(TS())对SK进行最长前缀匹配,并将匹配到的结果叶子赋值给变量Old_Leaf(OL);
307、判断OL是否为空,为空表明匹配不成功,则转330,若不为空,则匹配成功则转308;
308、找到了SK的最长前缀匹配OL,此时还需要判断OL是否已为级联的叶子,即判断OL的级联标志是否等于0,不等于0,说明OL是级联的,则转320;等于0,说明OL不是级联的(即是a)类最终的叶子节点),则转309;
309、进一步判断OL的关键字与SK是否相同,若相同(说明SK已经在CT中,而且是a)类节点,现在应该把它的级联类型改为c)类节点),则转310;若OL的关键字与SK不相同,则转311;
310、将OL的级联标记赋值为2,并将OL的值赋给变量New_Leaf(NL),然后转313;
311、用传统的插入操作Trd_Insert(TI())将SK插入到CT中,并将得到的新叶子赋给NL;
312、将NL的级联标志赋值为1(即为b)类节点,仅级联);
313、将SK所在叶子NL的回溯指针赋值为OL(因为Old_Leaf恰是能最长匹配SK的一个a)类或c)类节点);
同时用传统的TC生成一棵新的与传统方法的数据结构相同的空树New_Tree(NT),作为下一级子树;
还要将NL的下一级子树指针的值赋为NT,以便将新的下一级子树级联上;
然后将变量Cur_Tree(CT)赋值为New_Tree(NT),以便在新的子树中继续插入规则;之后转340;
320、将OL级联的下一级子树赋给CT,然后转340;
330、用传统的插入操作Trd_Insert(TI())将SK插入到CT中,并将得到的新叶子赋给NL;
331、同时还要用传统的TC生成一棵新的与传统方法的数据结构相同的空树NT,作为下一级子树;
332、将NL的级联标志赋值为1;
再将NL的下一级子树指针指向NT,以便将新的下一级子树级联上;
同时将NL的回溯指针赋值为空;
然后还要将变量CT赋值为NT,以便在新的子树中继续插入规则;
340、将变量SL的值增加L;将RL的值赋为Total_Len-Scaned_Len(简记为TL-SL),然后转304,继续循环;
350、当剩下的比特位数RL小于等于L比特时,将剩下的所有比特作为SK,即从关键字K的第SL比特位开始一直取到K的最后一比特位,形成子关键字SK;
351、判断SK的RL长度是否恰为L,若是则转352,若不是则转360;
352、在CT中用传统的TS()操作对SK进行最长前缀匹配,并将结果叶子赋给变量OL;
353、判断OL是否为空,若不为空(则说明SK在CT中有最长前缀匹配),则转354;否则转360;
354、判断OL的关键字(长度)等于SK,若等于(说明SK在CT中已经存在),则转355,否则转360(实际实现时,这个相等判断可以简化为判断两者长度是否相等的判断,若两者长度相等,而且进入到此步骤前最长前缀匹配已经成功,那么两者必然相等);
355、判断OL的级联标志是否不为0,若是(说明是级联的节点),则转356,若不是,则转357;
356、将OL的级联标志的值置为2(因为它原来就是级联的,现在又要充当叶子节点,存放用户数据,例如图2中先将(SaSbSe,User_data1)插入树中,再将(SaSb,User_data)插入时就会有此情况);
同时,将OL的回溯指针赋值为OL,即指向OL自己;
357、将用户数据UD写入叶子OL的用户数据域中,然后转370;
360、用传统的TI()操作将规则(Sub_Key,User_Data简记为SK,UD)插入到CT中,并将得到的新叶子赋给NL;
将NL的级联标志的值置为0(表示现在暂时还不级联);
将NL的回溯指针置为空;
将NL的下一级子树指针置为空;
370、返回。
每一条规则都按上述300到370的步骤执行,插入树中后,就可以得到关于此规则集合的级联树。在其上便可对更长的字符串进行最长前缀匹配的操作。
本实施例的逐级进行匹配的方法,其流程如图4所示,具体步骤如下:
400、在树T中对关键字K进行最长前缀匹配的函数Search(Tree,Key)入口传入两个参数Tree、Key(分别简记为T、K),其中,T表示在哪棵树中进行匹配操作,即搜索哪棵树,K是要匹配的关键字;
401、取得关键字K的总长度,并将此值赋给总长度变量Total_Len(TL);
402、判断总长度变量TL是否为0,为0则转417,否则转403;
403、对以下变量进行初始化:
将记录目前扫描过的比特位数的变量Scaned_Len(SL),赋值为0;
记录剩余的未被扫描到的比特位数的变量Remained_Len(RL),赋值为Total_Len(TL);
记录当前所搜索的树的变量Cur_Tree(CT),赋值为Tree(T);
记录匹配过程中所经过的叶子数Path_Leaf_Num(PLN),赋值为0;
记录是否找到的状态的变量Found(F),赋值为否;
404、判断是否RL大于0,而且没有找到(F的值为否)?若此条件成立,则转405继续处理,否则转418进行回溯;
405、判断RL是否大于等于L,若此条件不成立(即小于L),则说明只剩下最后一段,这种情况下转407,否则转406;
406、从K的第SL比特位开始取L比特形成子关键字Sub_Key(SK);然后转408;
407、从K的第SL比特位开始一直取到K的最后一比特位,形成子关键字SK;
408、在当前树CT中用传统的TS()操作对子关键字SK进行最长前缀匹配,并将结果赋给变量Found_Leaf(FL);
409、判断FL是否为空,若为空说明在此子树中的匹配失败,则转410;否则说明在此子树中对子关键字SK的最长前缀匹配成功,则转411;
410、将RL强制置为0,并转404(实际上转到404后,其条件判断肯定不成立,便退出了循环,转到418去进行回溯了);
411、判断FL的级联标志是否等于0,等于0说明此节点已经是最终的叶子节点,是要找的最长前缀匹配,于是转416;否则,说明FL还级联有下一级子树,还要继续搜索下去,于是转412;
412、将所经过的中间叶子节点FL加入到数组Path_Leaf(PL)中;并将该数组数下标变量PLN加1(PLN+1)的值赋给PLN,即将PLN递增1;
413、将FL的下一级子树指针所指的树赋给CT;并将变量SL的值增加L;同时将RL的值赋为Total_Len-Scaned_Len(TL-SL);然后转404继续循环下去;
416、当流程走到这里时,说明整个匹配都成功了,置状态变量F的值为真,表示找到了,然后转404;转到404后其条件判断必为假,于是转418;到418后其条件判断也为假,最后转到430返回FL,即返回找到的结果(这里之所以有通过多个判断来转出,主要是为了遵循结构化程序设计一个入口一个出口的规范,具体实现时可以自行决定是否直接返回FL的值);
418、判断状态变量F的值,看看是否找到了终的匹配结果,若F为真,表明找到,则转430;否则没有找到,则转420;
420、判断PLN是否大于0,大于0(说明匹配过程中经过的叶子数至少为1,且数组中记下了相应数目的中间叶子节点),于是转421,否则说明局部匹配没有一次成功过,此时FL肯定为空,于是转430;
421、将PLN-1的值赋给变量i;
422、以i为循环变量进行循环,实现回溯;
423、将数组元素PL[i]中记录的叶子的回溯指针的值赋给变量FL;
424、判断FL是否为空,若不为空,说明找到了一个最找前缀匹配,则转430,否则,还需要在数组PL中继续向前寻找,于是转425;
425、将循环变量i-1的值赋给i,即将i循环递减1;
426、判断i是否小于0,小于0则退出循环,转430;否则转422,继续循环;
430、将FL的值返回。
至此匹配操作便结束,若最后返回的FL不为空,则表示在树Tree中找到了关键字K的最长前缀匹配,若返回的FL为空,则表明没有找到。
用户的规则集合是可以变化的,当用户要删除规则集合中的一条规则(Key,User_Data)时,就需要删除级联树中相应的节点。其方法是,先要找到与关键字Key精确匹配的叶子节点,再删除此叶子。对此叶子的删除若使得其所在的子树为空,则要向前继续删除上一级叶子节点。
本实施例的规则的删除方法,其流程如图5所示,具体包括以下步骤:
500、在树T中删除关键字K所在叶子的函数Delete(Tree,Key)入口传入Tree、Key(T、K)两个参数,T表示在哪棵树中进行删除动作,K是要删除的规则的关键字的值;
501、取得关键字K的总长度,并将此值赋给变量Total_Len(TL);
502、判断总长度TL是否为0,为0则转540返回主程序,否则转503继续处理;
503、进行以下变量的初始化工作;
将记录目前扫描过的比特位数的变量Scaned_Len(SL)赋初值为0;
记录剩余的未被扫描到的比特位数的变量Remained_Len(RL)赋初值为TL;
记录当前所操作的树的变量Cur_Tree(CT)赋初值为T;
记录匹配过程中所经过的叶子数的变量Leaf_Num(LN)赋初值为0;
504、判断RL是否大于0,若不大于0,说明已经进行完了精确匹配的过程,可以开始删除相应节点了,于是转520;若大于0转505;
505、判断RL是否大于等于L,不大于等于(即小于)则说明只剩下最后一段,这种情况下转507,否则转506;
506、从关键字K的第SL比特位开始取L比特形成子关键字Sub_Key(SK),然后转508;
507、从关键字K的第SL比特位开始一直取到K的最后一比特位,形成子关键字SK;
508、在树CT中用TS()操作对SK进行最长前缀匹配,并将结果赋给变量FL;
509、判断FL是否为空,若为空说明在此子树中的匹配失败,则转540返回,因为删除必须是精确匹配,所以不用回溯;若FL不为空,则说明在此子树中对子关键字SK的最长前缀匹配成功,但还需要看看此匹配是否为精确匹配,于是转511;
511、判断FL的关键字是否等于K,同样如354所述的理由,(实现时可用长度相等来简化此判断),若相等,则转512;否则说明没有找到精确匹配,转540返回;
512、将经过的中间叶子节点及其所在子树记在相应数组中,包括:将FL加入数组PL中,将CT加入到数组PT中,同时将LN+1的值赋给LN,即LN递增1;
513、将变量SL的值增加L,将RL的值赋为TL-SL;
514、判断FL的级联标志是否不等于0,等于0说明此FL已经是个叶子,不能再进行下一级的搜索了,于是转520;否则不等于0,说明还级联有下一级子树,还要在下一级子树中进行搜索,于是转515;515、将FL的下一级子树指针所指的树赋给CT转504,继续在下一级子树中进行搜索;
520、判断RL是否小于等于0,若不是,则意味着没有匹配完关键字K的所有比特位就跳出了循环,说明没有找到精确匹配,不能删除,于是转540返回;若是,则说明已经扫描完了K的所有比特位,可以继续,于是转521;
521、判断精确匹配过程中经过的中间叶子节点的数目LN是否大于0,若不大于0,则说明也没有完成精确匹配,不能删除,于是转540;否则转522;
522、判断最后匹配到的那个叶子节点Path_Leaf[Leaf_Num-1](PL[LN-1])的级联标志是否不等于0,不等于0说明这个节点不是最终的叶子节点,也不存放有用户数据,不能删除它,但要对它的级联标志进行一定的修改,于是转532;否则才能删除此节点,于是转523,开始删除操作;
523、将LN-1的值赋给i;
524、以i为循环变量进行循环;
525、判断PL[i]的级联标志是否等于2,等于2说明此节点存有用户数据并且还级联有下一级子树,对它的删除操作只需改变它的级联状态,变为最终的叶子节点状态即可,于是转529;否则,则要删除此节点,于是转526;
526、用传统的TD()操作将PL[i]的关键字从树PT[i]中删掉;
527、判断树PT[i]是否为空,若为空,则要继续删除上一级节点,于是转528;否则转540返回;
528、将i-1的值赋给i,即将i递减1;
529、将PL[i]的级联标志赋置为0,表示它是一个仅存有用户数据的最终叶子节点;
530、判断i是否小于0,小于0则退出循环,转540;否则转524,继续循环;
532、判断PL[LN-1]的级联标志是否等于2,等于2说明此节点存有用户数据并且还级联有下一级子树,对它的删除操作只需改变它的级联状态,使用户数据无效即可,于是转534,否则说明PL[LN-1]的级联标志等于1,是一个仅级联的节点,不能删除,于是转540;
534、将PL[LN-1]的级联标志置为1,表示仅级联;
540、返回。
如果对匹配操作的性能要求较高,本发明方法完全采用硬件(FPGA或ASIC)实现。

Claims (2)

1、一种计算机网络中实现长字符串前缀匹配的方法,其特征在于,包括以下步骤:
1)采用多个能实现有限长度为L的字符串的最长前缀匹配的数据结构作为结构单元,所述数据结构是指由线性表加Patracia树加叶子组成的复合树,该叶子中有存贮用户数据的空间;
2)将用于匹配的每一条规则中的关键字按顺序分成多个子关键字,除最后一个子关键字外,各子关键字的长度为L,最后一个子关键字的长度等于或小于L;
3)将每个子关键字分别插入到所说的各个结构单元中,并将各个结构单元级联在一起形成级联数据结构,将各个结构单元级联在一起的方法为:将某一级结构单元的叶子中所说的用户数据空间中设置一个表示级联状态的标志,并在该空间中设置一个指向下一级子树的指针,以及设置一个指向回溯叶子的指针;
4)将待匹配的字符串按长度为L分成多段子串,除最后一段外,每段长度为L,最后一段的长度等于或小于L;
5)依次将每段子串与所说的级联数据结构的每个单元中的子关键字逐级进行匹配,得到待匹配字符串的最长前缀匹配结果。
2、如权利要求1所述的实现长字符串前缀匹配的方法,其特征在于,还包括:
6)根据用户需要,删除以某字符串为关键字的相应规则,具体包括以下步骤:
(A)先将用户所给出的字符串按长度为L分成多段子串,除最后一段外,每段长度为L,最后一段的长度等于或小于L;
(B)依次将每段子串与所说的级联结构中的每个结构单元中的子关键字逐级进行精确匹配,得到待匹配字符串的精确匹配结果;
(C)从所说的匹配过程所经过的结构单元中的最后一级子树开始逐级向前删除子关键字,如果删除某子关键字后其原来所在的子树不为空,则停止删除操作。
CN 02129945 2002-08-23 2002-08-23 一种实现长字符串前缀匹配的方法 Expired - Fee Related CN1253817C (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN 02129945 CN1253817C (zh) 2002-08-23 2002-08-23 一种实现长字符串前缀匹配的方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN 02129945 CN1253817C (zh) 2002-08-23 2002-08-23 一种实现长字符串前缀匹配的方法

Publications (2)

Publication Number Publication Date
CN1477559A CN1477559A (zh) 2004-02-25
CN1253817C true CN1253817C (zh) 2006-04-26

Family

ID=34144337

Family Applications (1)

Application Number Title Priority Date Filing Date
CN 02129945 Expired - Fee Related CN1253817C (zh) 2002-08-23 2002-08-23 一种实现长字符串前缀匹配的方法

Country Status (1)

Country Link
CN (1) CN1253817C (zh)

Families Citing this family (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN100421114C (zh) * 2006-04-21 2008-09-24 华为技术有限公司 基于关键字进行数据匹配查询的方法
CN100531140C (zh) * 2006-12-20 2009-08-19 中国科学院计算技术研究所 一种实现无回溯的最长前缀匹配搜索的方法和装置
CN101675430B (zh) * 2007-05-01 2013-02-06 国际商业机器公司 用于近似串匹配的方法和系统
CN101286988B (zh) * 2008-04-18 2011-05-04 北京启明星辰信息技术股份有限公司 一种并行多模式匹配的方法及系统
CN101677318B (zh) * 2008-09-18 2012-05-23 北京启明星辰信息技术股份有限公司 匹配规则包含次数指示符的并行多模式匹配的方法及系统
CN101901257B (zh) * 2010-07-21 2012-07-04 北京理工大学 一种搜索引擎中的多字符串匹配方法
CN102446167B (zh) * 2011-08-31 2016-03-30 中博信息技术研究院有限公司 一种基于逻辑模板对复杂字符串逻辑处理的方法和装置
CN103679165B (zh) * 2013-12-31 2017-02-08 北京百度网讯科技有限公司 Ocr字符识别方法及系统
CN110245330B (zh) * 2018-03-09 2023-07-07 腾讯科技(深圳)有限公司 字符序列匹配方法、实现匹配的预处理方法和装置
CN111291058B (zh) * 2020-03-17 2023-06-16 芯启源(南京)半导体科技有限公司 一种基于分层pc-trie结构的LPM规则存储方法
CN114090840A (zh) * 2020-08-24 2022-02-25 华为技术有限公司 序列查找方法、装置、设备及介质

Also Published As

Publication number Publication date
CN1477559A (zh) 2004-02-25

Similar Documents

Publication Publication Date Title
CN1253817C (zh) 一种实现长字符串前缀匹配的方法
CN1148687C (zh) 用于网络处理器的全匹配搜索方法和设备
CN1096036C (zh) 以格阵作关键字的字典检索装置和方法
CN1822003A (zh) 数据库
CN100337407C (zh) 对结构化文档进行编码和解码的方法和系统
CN1761958A (zh) 用于查找串的方法和设备
CN1111815C (zh) 在数据库中存储元素和寻找这样存储的元素的方法
CN1744573A (zh) 业务流的识别方法
CN1647076A (zh) 查询关系数据库的方法和设备
CN1894696A (zh) 检测数据流中的模式的方法和装置
CN1316708A (zh) 对软件管理树进行模式范围比较的方法和装置
CN1211769A (zh) 基于贝叶斯网络的用于文件检索的方法和设备
CN1556482A (zh) 一种用于实现数据库多表查询的数据处理方法
CN1959674A (zh) 网络搜索方法、网络搜索设备和用户终端
CN1457476A (zh) 数据库注释与检索
CN1316707A (zh) 数据压缩与检索方法和数据检索设备及记录媒体
CN1598823A (zh) 使用元数据的索引的元数据搜索方法和装置
CN1667609A (zh) 文档信息管理系统和文档信息管理方法
CN1239793A (zh) 基于字符分类检索字符串的装置和方法
CN1722138A (zh) 结构化文档管理设备、搜索设备、存储和搜索方法及程序
CN1173933A (zh) 建立通信网络数据库的一种方法和设备
CN1866250A (zh) 对系统数据进行管理的方法和系统
CN1460244A (zh) 语句识别装置、语句识别方法、程序和媒体
CN101031892A (zh) 排列的生成方法以及排列生成程序
CN1786963A (zh) 一种数据库密文查询的方法

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
C17 Cessation of patent right
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20060426

Termination date: 20110823