表项查找方法和装置的制作方法

文档序号:7701379阅读:99来源:国知局

专利名称::表项查找方法和装置的制作方法
技术领域
:本发明涉及通信技术,尤其涉及一种表项查找方法和装置。
背景技术
:随着网络的发展,IPv6和精细化管理是日后发展的必然趋势。现在的IPv4的网络地址为32bit,IPv6网络地址为128bit,/人而导致使用网络地址作为关键(Key)值进行完全匹配(FullMatch,以下筒称FM)表的表项查找的关键值长度有了巨大的增长,使得表项查找效率急剧下降。同理,网络上现在流行的对数据流量进行精细化管理则是基于数据流的处理,其利用报文五元组(源IP地址+目的IP地址+协议类型+源端口号+目的端口号)来区分报文所属的数据流,需要的关键值长度约为120bit,随着网络精细化管理需要的进一步提升,会出现利用七元组、九元组等,区分报文所属的数据流所需要的关键值长度更为庞大,也会使得FM表的表项查找效率急剧下降。现在普遍使用的一种FM表的表项查找方案是哈希(harsh)表。哈希表指的是通过设定的哈希函数和所选中的处理冲突的方法,将一组关键字映像到一个有限的、地址连续的地址集上,并以关键字在地址集中的索引作为相应记录在FM表中的存储位置。在哈希表中,若输入的两个关键字不同而输出的函数值相同,则称这两个关键字为"同义词",称这种现象为"冲突"。对于FM表而言,很难找到没有沖突的哈希函数。可以采用多次哈希解决冲突问题。但是,对于长关键值的FM表而言,表项数据较多,表项冲突严重,查找效率较低。即使采用多次哈希后表项数据仍然较多,查找效率仍然较低。
发明内容本发明实施例提供了一种表项查找方法和装置,用以实现提高长关键值表项的查找效率。本发明实施例提供了一种表项查找方法,包括将原始关键字分割为子关键字,分别以各子关键字作为第一关键字查找相应的第一级散列表,得到与所述第一关^T建字对应的第一表项,所述第一表项中保存有所述第一关键字的同义词的数量值以及指向第二级散列表的第一索引;根据第一关键字的同义词的数量值最小的第一表项中保存的第一索引,获取所述第二级散列表,以所述原始关键字中除与所述第一关键字的同义词的数量值最小的第一表项对应的第一子关键字外的其他子关键字作为第二关键字查找所述第二级散列表,得到与所述第二关键字对应的第二表项,所述第二表项中保存有指向第三级散列表的第二索引;根据所述第二索引,获取所述第三级散列表,所述第三级散列表的表项中保存有散列值以及指向内存空间的内存索引,以所述原始关键字作为第三关键字进行散列运算得到第三散列值,在所述第三级散列表中找到保存有所述第三散列值的第三表项,根据所述第三表项中保存的所述内存索引,通过关键字匹配,在所述内存空间中获取与所述原始关键字对应的数据项。本发明实施例提供了一种表项查找装置,包括分割模块,用于将原始关键字分割为子关键字;第一查找模块,用于分别以各子关键字作为第一关键字查找相应的第一级散列表,得到与所述第一关键字对应的第一表项,所述第一表项中保存有所述第一关键字的同义词的数量值以及指向第二级散列表的第一索引;第二查找模块,用于根据第一关键字的同义词的数量值最小的第一表项中保存的第一索引,获取所述第二级散列表,以所述原始关键字中除与所述第一关键字的同义词的数量值最小的第一表项对应的第一子关键字外的其他子关键字作为第二关键字查找所述第二级散列表,得到与所述第二关键字对应的第二表项,所述第二表项中保存有指向第三级散列表的第二索引;第三查找模块,用于根据所述第二索引,获取所述第三级散列表,所述第三级散列表的表项中保存有散列值以及指向内存空间的内存索引,以所述原始关键字作为第三关键字进行散列运算得到第三散列值,在所述第三级散列表中找到保存有所述第三散列值的第三表项;匹配模块,用于根据所述第三表项中保存的所述内存索引,通过关键字匹配,在所述内存空间中获取与所述原始关键字对应的数据项。本发明实施例将原始关键字分割为子关键字,找到第一关键字的同义词最少的第一表项进行下一步查找,以有限的空间资源换取查找效率的提升,采用具有较少散列值的第三级散列表进行关键字匹配,优化了关键字匹配的效率,大幅度地提高了长关键字表项的查找效率。图1为本发明表项查找方法第一实施例的流程示意图2为本发明表项查找方法第一实施例中一表项结构示意图3为本发明表项查找方法第二实施例的流程示意4为本发明表项查找装置第一实施例的结构示意图;图5为本发明表项查找装置第二实施例的结构示意图。具体实施例方式下面通过附图和实施例,对本发明的技术方案做进一步的详细描述。如图1所示,为本发明表项查找方法第一实施例的流程示意图,可以包括如下步骤步骤ll、将原始关键字分割为子关键字,分别以各子关键字作为第一关键字查找相应的第一级散列表,得到与第一关键字对应的第一表项,该第一表项中保存有该第一关键字的同义词的数量值以及指向第二级散列表的第一索引;如图2所示,为本发明表项查找方法第一实施例中一表项结构示意图,将原始关键字(originalkey)划分为四个子关4建字subkeyl、subkey2、subkey3和subkey4,以各子关键字作为第一关键字进行散列运算得到第一散列值,查找相应的第一级散歹寸表hashtablel、hashtable2、hashtable3和hashtable4,获取与第一散列值对应的第一表项。优选地,可以采用最适合原始关键字的数据分布的分割算法把能够有效散列数据的关键字字段分割为子关键字,并采用适合各个子关键字的散列算法进行散列。步骤l2、根据第一关键字的同义词的数量值最小的第一表项中保存的第一索引,获取第二级散列表,以原始关键字中除与第一关键字的同义词的数量值最'J、的第一表项对应的第一子关键字外的其他子关键字作为第二关键字查找第二级散列表,得到与第二关键字对应的第二表项,该第二表项中保存有指向第三级散列表的第二索引;再参见图2,假设hashtablel中的第一表项中的第一关键字的同义词的数量值为6,hashtable2中的第一表项中的第一关键字的同义词的数量值为8,hashtable3中的第一表项中的第一关键字的同义词的数量值为12,hashtable4中的第一表项中的第一关4建字的同义词的数量值为16,则选择hashtablel中的第一表项进行下一步查找,根据hashtablel中的第一表项中保存的第一索引,获取第二级散列表S-hashl,将原始关键字中除subkeyl外的其他子关键字,即subkey2、subkey3和subkey4作为第二关4建字,进行散列运算得到第二散列值,查找第二级散列表S-hashl,获取与第二散列值对应的第二表项,例如S-hashl-l,该第二表项中保存有指向第三极散列表的第二索引,即图中的point。步骤13、根据第二索引,获取第三级散列表,该第三级散列表的表项中保存有散列值以及指向内存空间的内存索引,以原始关键字作为第三关键字进行散列运算得到第三散列值,在第三级散列表中找到保存有第三散列值的第三表项,根据第三表项中保存的内存索引,通过关键字匹配,在内存空间中获取与原始关键字对应的数据项。再参见图2,第三级散列表F—hash是对整个原始关键字进行散列运算得到的由较少的数据值组成的一个集合。按照散列算法原理,如果散列值不同,关4建字必然不同,例如F—hashl对应的关#:字与F_hash2对应的关键字必然不同,所以在进行关键字匹配时,只要比较散列值即可排除大部分与目标值不同的值。根据第三散列值,查找第三级散列表得到第三散列值对应的内存索引,根据该内存索引得到内存数据和关键字,通it^"原始关键字和内存中的关键字的匹配来检验表项查找的正确性,例如原始关键字进行散列运算得到的第三散列值为F-hashl2,则查找F—hash,找到F一hashl2,再找到F—hashl2对应的内存索引indexl3和indexl4,查4戈indexl3和indexl4冲旨向的内存空间,该内存空间中保存有关键字以及关键字对应的内存数据,若该内存空间中的关键字与原始关键字,则该内存数据为原始关键字对应的数据。本实施例将原始关键字分割为子关^l建字,找到各第一级散列表中第一关键字的同义词最少的第一表项进行下一步查找,以有限的空间资源换取查找效率的提升,用具有较少散列值的第三级散列表进行关键字匹配,优化了关键字匹配的效率,大幅度地提高了长关键字表项的查找效率。如图3所示,为本发明表项查找方法第二实施例的流程示意图,可以包括如下步骤步骤21、将原始关键字分割为子关键字,分别以各子关键字作为第一关键字查找相应的第一级散列表,得到与第一关键字对应的第一表项,该第一表项中保存有该第一关键字的同义词的数量值以及指向第二级散列表的第一索引;其中,第一级散列表为对第一关键字进行散列运算得到的散列值的有序集合。该第一索引包括^f旦不限于指针。步骤22、根据第一关键字的同义词的数量值最小的第一表项中保存的第一索引,获取第二级散列表,以原始关键字中除与第一关键字的同义词的数量值最小的第一表项对应的第一子关键字外的其他子关键字作为第二关键字查找第二级散列表,得到与第二关键字对应的第二表项,该第二表项中保存有指向第三级散列表的第二索引,该第二级散列表为对第二关键字进行散列运算得到的散列值的有序集合。该第二索引包括但不限于指针。第二级散列表的数据结构形式包括但不限于链表、跳表、B树或B+树。步骤23、根据第二索引,获取第三级散列表,该第三级散列表的表项中保存有散列值以及指向内存空间的内存索引,以原始关键字作为第三关键字进行散列运算得到第三散列值,在第三级散列表中找到保存有第三散列值的第三表项,根据第三表项中保存的内存索引,通过关键字匹配,在内存空间中获取与原始关键字对应的数据项;其中,第三级散列表为对第三关键字进行散列运算得到的散列值的有序集合。在步骤23中,可以采用循环冗余校验算法进行计算得到第三级散列值。第三级散列表的数据结构形式包括但不限于链表或数组。与上一实施例的不同之处在于,通过对第一级散列表、第二级散列表和第三级散列表的有序排列,转化树表中对长关键字的逐位匹配和散列表中对长关键字的逐级的多次散列匹配为对一个有序集合的高速查找,在有效提高数据查找效率的情况下,有效降低了内存的使用情况。下面,通过一具体应用场景对本实施例的技术方案进行阐述。再参见图2,首先对超长的原始关键字进行分段处理,将超长的原始关键字分割为四个独立的子关键字subkeyl、subkey2、subkey3和subkey4。需要说明的是,对原始关键字的分段原则包括但不限于对原始关键字平均分割,还可以根据具体的原始关键字的数据构成,把相关性较强的或者散列较好的数据分割为一个子关键字,采用适合该子关键字的散列算法进行散列。本实施例中简单地按照原始关键字的长度,平均分割了4个子关键字,对每个子关键字进行散列运算构成一套完整的数据集合,即图中的第一级散列表hashtable。在每个第一级散列表的一个表项中包括但不限于下列的数据1)该表项对应的同义词的索引。该索引可以使用的数据结构包括但不限于指针,即图中指向S-hash表的指针。2)该子关键字的同义词的数量值。需要注意的是,在排序时,需要维护每个第一级散列表的表项中的子关键字的同义词的数量值,若增加表项时,对该数量值进行加操作,删除表项时,对该数量值进行减操作。3)在该子关键字的同义词的有序数据集合中查找数据。在查找时,同时查找多个第一级散列表,通过比较多个第一级散列表的数量值字段,挑选出同义词的数量值最小的第一级散列表进行下一步查找操作。图示的第二级散列表S—hash表是一个以原始关键字中非本子关键字的其他子关键字进行散列运算得到的散列值一个有序集合。本发明中称该有序集合中的散列值为S-hash值。该S—hash表的数据结构形式包括但不限于链表、跳表、B树、B+树等。通过对S-hash值的有序排列,转化树表中对长关键字的逐位匹配和散列表中对长关键字的逐级多次散列匹配为对一个有序集合的高速查找和排序,在有效提高了表项查找效率的情况下,有效降低了内存的使用情况。每个S-hash表的表项中包括但不限于下列数据1)第二关键字的同义词的索引。索引可以使用的数据形式包括但不限于指针,即图中指向第三级散列表page—data的指针。需要说明的是,本实施例中所采用的两级散列和两级索引的形式只是一个实施例,本发明不限于此,在资源充足的情况下,本发明支持更多级的散列和索引。'S-hash表的表项中的索引所指向的数据集合即第二关键字的同义词的数据集合,本实施例中称此数据集合为第三级散列表F-hash表,该数据集合中的单元为F-hash值。F—hash表是通过对整个原始关键字进行散列运算得到的一个较少的数据项组成的数据集合的有序集。由于原始关键字很长,如果对完整的原始关键字的同义词和查找的目标关键字进行匹配需要耗费较多的内存资源和计算资源。本实施例通过F丄ash表的排序处理有效地提高匹配的效率。根据散列算法原理可知,如果散列值不同,关键字必然不同。所以在进行原始关键字的匹配时,只需要比较F—hash值即可排除大部分与目标关键字不相同的关键字。在图2中即存在不同的表项内存索引值对应了相同的F—hash值。在每一个F-hash表的表项中需要包括但不限于下列数据1)第三关键字的同义词的内存索引。该内存索引可以使用的数据形式包括但不限于指针,即图示中指向page-data的指针。2)第三关键字对应的F—hash值。得到该F—hash值的散列算法包括但不限于CRC32。通过匹配F_hash表所对应的表项的内存索引得到实际的内存表项,在内存表项中存放有表项数据和目标关键字,通过对目标关键字和原始关键字的匹配,检验表项查找的正确性。F—hash表的数据结构形式包括但不限于链表、数组等数据结构,F—hash表的排序和查找算法依赖于实际的数据组织形式。本实施例将原始关键字分段匹配,在各第一级查找表中找到第一关键字的同义词最少的一个第一表项进行查找,以有限的空间资源换取查找效率的提升。通过对第一级散列表、第二级散列表和第三级散列表的有序排列,极13大提高查找速度。第三级散列表包括较少的第三散列值,用较少的第三散列值进行关键字匹配,优化了关键字匹配的效率。通过上述三个方面,大幅度地提高了长关键字表项的查找效率。如图4所示,为本发明表项查找装置第一实施例的结构示意图,可以包括分割模块40、第一查找模块41、第二查找模块42、第三查找模块43和匹配模块44。其中,分割模块40用于将原始关键字分割为子关键字;优选地,可以把相关性较强的或者散列较好的数据分割组合为一个子关键字;第一查找模块41用于分别以各子关键字作为第一关键字查找相应的第一级散列表,得到与所述第一关键字对应的第一表项,所述第一表项中保存有所述第一关键字的同义词的数量值以及指向第二级散列表的第一索引。具体地,第一查找模块4l对各个子关键字进行散列运算得到第一散列值,查找相应的第一级散列表,获取与第一散列值对应的第一表项。优选地,采用最适合原始关键字的数据分布的分割算法把能够有效散列数据的关键字字段分隔为子关键字,并采用适合各个子关键字的散列算法进行散列。第二查找模块42用于根据第一关键字的同义词的数量值最小的第一表项中保存的第一索引,获取第二级散列表,以原始关键字中除与第一关键字的同义词的数量值最小的第一表项对应的第一子关键字外的其他子关键字作为第二关键字查找第二级散列表,得到与第二关键字对应的第二表项,该第二表项中保存有指向第三级散列表的第二索引。具体地,第二查找模块42可以通过比较多个第一级散列表的第一表项中的同义词的数量值字段,挑选出子关键字沖突最严重,也就是同义词的数量值最小的第一表项进行下一步查找操作,根据保存有同义词的数量值最小的第一表项中保存的第一索引,获取第二级散列表,对原始关键字中除与同义词的数量值最小的第一表项对应的子关键字外的其他子关键字作为第二关键字进行散列运算得到第二散列值,查找第二级散列表,获取与第二散列值对应的第二表项。第三查找模块43用于根据第二索引,获取第三级散列表,第三级散列表的表项中保存有散列值以及指向内存空间的内存索引,以原始关键字作为第三关键字进行散列运算得到第三散列值,在第三级散列表中找到保存有第三散列值的第三表项。匹配模块44用于根据第三表项中保存的内存索引,通过关键字匹配,在内存空间中获取与原始关键字对应的数据项。第三级散列表是对整个原始关键字进行散列运算得到的由较少的数据值组成的一个集合。按照散列算法原理,如果散列值不同,关键字必然不同,所以在进行关键字匹配时,只要比较散列值即可排除大部分与目标值不同的值。根据第三散列值查找第三级散列表得到第三散列值对应的内存索引,根据该内存索引得到内存数据和关键字,通过对原始关键字和关键字的匹配检验表项查找的正确性。本实施例通过分割模块40和第一查找模块41将原始关键字分段匹配,第二查找模块42找到同义词最少的第一表项进行下一步查找,以有限的空间资源换取查找效率的提升,第三查找模块43采用具有较少散列值的第三级散列表进行关键字匹配,优化了关键字匹配的效率,大幅度地提高了长关键字表项的查找效率。如图5所示,为本发明表项查找装置第二实施例的结构示意图,可以包括分割模块40、第一查找模块41、第二查我模块42、第三查找单元53和匹配模块44。其中,分割模块40用于将原始关键字分割为子关^T建字。第一查找模块41用于分别以各子关键字作为第一关键字查找相应的第一级散列表,得到与第一关4定字对应的第一表项,该第一表项中保存有第一关键字的同义词的数量值以及指向第二级散列表的第一索引;其中,第一级散列表为对第一关键字进行散列运算得到的散列值的有序集合;该第一索引包括但不限于指针。第二查找模块42用于根据第一关键字的同义词的数量值最小的第一表项中保存的第一索引,获取第二级散列表,以原始关键字中除与第一关键字的同义词的数量值最'J、的第一表项对应的第一子关键字外的其他子关键字作为第二关键字查找第二级散列表,得到与第二关键字对应的第二表项,该第二表项中保存有指向第三级散列表的第二索引;其中,第二级散列表为对第二关键字进行散列运算得到的散列值的有序集合。该第二索引包括但不限于指针。第二级散列表的数据结构形式包括但不限于链表、跳表、B树或B+树。第三查找单元53用于根据第二索引,获取第三级散列表,该第三级散列表的表项中存储有散列值以及与该散列值对应的内存索引,以原始关键字作为第三关键字,采用循环冗余校验算法进行计算得到第三散列值,在第三级散列表中找到保存有第三散列值的第三表项;其中,第三级散列表为对第三关键字进行散列运算得到的散列值的有序集合。需要说明的是,第三查找单元53采用的算法包括但不限于循环冗余校验算法。第三级散列表的数据结构形式包括但不限于链表或数组。匹配模块44用于根据第三表项中保存的内存索引,通过关键字匹配,在内存空间中获取与原始关键字对应的数据项。与上一实施例的不同之处在于,通过对第一级散列表、第二级散列表和第三级散列表的有序排列,转化树表中对长关键字的逐位匹配和散列表中对长关键字的逐级的多次散列匹配为对一个有序集合的高速查找,在有效提高数据查找效率的情况下,有效降低了内存的使用情况。在本实施例中,分割模块40和第一查找4莫块41将原始关4建字分割为子关键字,第二查找模块42找到各第一散列表中第一关键字的同义词最少的第一表项进行下一步查找,以有限的空间资源换取查找效率的提升。另外,通过对第一级散列表、第二级散列表和第三级散列表的有序排列,极大提高查找速度。第三查找单元53采用较少散列值的第三极散列表进行关键字匹酉己,优化了关键字匹配的效率。通过上述三个方面,大幅度地提高了长关键字表项的查找效率。最后应说明的是以上实施例仅用以说明本发明的技术方案而非限制,尽管参照较佳实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明技术方案的并奮神和范围。权利要求1、一种表项查找方法,其特征在于,包括将原始关键字分割为子关键字,分别以各子关键字作为第一关键字查找相应的第一级散列表,得到与所述第一关键字对应的第一表项,所述第一表项中保存有所述第一关键字的同义词的数量值以及指向第二级散列表的第一索引;根据第一关键字的同义词的数量值最小的第一表项中保存的第一索引,获取所述第二级散列表,以所述原始关键字中除与所述第一关键字的同义词的数量值最小的第一表项对应的第一子关键字外的其他子关键字作为第二关键字查找所述第二级散列表,得到与所述第二关键字对应的第二表项,所述第二表项中保存有指向第三级散列表的第二索引;根据所述第二索引,获取所述第三级散列表,所述第三级散列表的表项中保存有散列值以及指向内存空间的内存索引,以所述原始关键字作为第三关键字进行散列运算得到第三散列值,在所述第三级散列表中找到保存有所述第三散列值的第三表项,根据所述第三表项中保存的所述内存索引,通过关键字匹配,在所述内存空间中获取与所述原始关键字对应的数据项。2、根据权利要求l所述的方法,其特征在于,所述第一级散列表为对所述第一关键字进行散列运算得到的散列值的有序集合;所述第二级散列表为对所述第二关键字进行散列运算得到的散列值的有序集合;所述第三级散列表为对所述第三关键字进行散列运算得到的散列值的有序集合。3、根据权利要求1或2所述的方法,其特征在于,所述以所述原始关键字作为第三关键字进行散列运算得到第三散列值具体为以所述原始关键字作为第三关键字,采用循环冗余校验算法进行计算得到第三散列值。4、根据权利要求1或2所述的方法,其特征在于,所述第一索引、所述第二索引和所述内存索引包括指针。5、根据权利要求1或2所述的方法,其特征在于,所述第二级散列表包括链表、跳表、B树或B+树。6、根据权利要求1或2所述的方法,其特征在于,所述第三级散列表包括链表或数组。7、一种表项查找装置,其特征在于,包括分割模块,用于将原始关键字分割为子关键字;第一查找模块,用于分别以各子关键字作为第一关键字查找相应的第一级散列表,得到与所述第一关键字对应的第一表项,所述第一表项中保存有所述第一关^t建字的同义词的数量值以及指向第二级散列表的第一索引;第二查找模块,用于根据第一关键字的同义词的数量值最小的第一表项中保存的第一索引,获取所述第二级散列表,以所述原始关键字中除与所述第一关键字的同义词的数量值最小的第一表项对应的第一子关键字外的其他子关键字作为第二关键字查找所述第二级散列表,得到与所述第二关键字对应的第二表项,所述第二表项中保存有指向第三级散列表的第二索引;第三查找模块,用于根据所述第二索引,获取所述第三级散列表,所述第三级散列表的表项中保存有散列值以及指向内存空间的内存索引,以所述原始关键字作为第三关键字进行散列运算得到第三散列值,在所述第三级散列表中找到保存有所述第三散列值的第三表项;匹配模块,用于根据所述第三表项中保存的所述内存索引,通过关键字匹配,在所述内存空间中获取与所述原始关键字对应的数据项。8、根据权利要求7所述的装置,其特征在于,所述第一级散列表为以所述第一关键字进行散列运算得到的散列值的有序集合;所述第二级散列表为对所述第二关键字进行散列运算得到的散列值的有序集合;所述第三级散列表为对所述第三关键字进行散列运算得到的散列值的有序集合。9、根据权利要求7或8所述的装置,其特征在于,所述第三查找模块包括第三查找单元,用于根据所述第二索引,获取第三级散列表,所述第三级散列表的表项中存储有散列值以及与所述散列值对应的内存索引,以所述原始关键字作为第三关键字,采用循环冗余校验算法进行计算得到第三散列值,在所述第三级散列表中找到保存有所述第三散列值的第三表项。10、根据权利要求7或8所述的装置,其特征在于,所述第一索引、所述第二索引和所述内存索引包括指针。11、根据权利要求7或8所述的装置,其特征在于,所述第二级散列表包括链表、跳表、B树或B+树。12、根据权利要求7或8所述的装置,其特征在于,所述第三级散列表包括链表或数组。全文摘要本发明实施例涉及一种表项查找方法和装置。方法包括将原始关键字分割为子关键字,分别以各子关键字作为第一关键字查找第一级散列表,得到第一表项;根据第一关键字的同义词的数量值最小的第一表项中保存的第一索引,获取第二级散列表,以原始关键字中除第一关键字外的其他子关键字作为第二关键字查找第二级散列表,得到第二表项;根据第二表项中保存的第二索引,获取第三级散列表,以原始关键字作为第三关键字进行散列运算得到第三散列值,根据第三散列值在第三级散列表中找到散列值为第三散列值的第三表项,根据第三表项中保存的内存索引,通过关键字匹配,获取与第三散列值对应的数据项。本发明实施例可以提高长关键值表项的查找效率。文档编号H04L29/12GK101594319SQ20091008836公开日2009年12月2日申请日期2009年6月26日优先权日2009年6月26日发明者龑裴申请人:华为技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1