CN111638925A - 一种接口方法表生成方法、函数指针查询方法及装置 - Google Patents
一种接口方法表生成方法、函数指针查询方法及装置 Download PDFInfo
- Publication number
- CN111638925A CN111638925A CN201910156548.8A CN201910156548A CN111638925A CN 111638925 A CN111638925 A CN 111638925A CN 201910156548 A CN201910156548 A CN 201910156548A CN 111638925 A CN111638925 A CN 111638925A
- Authority
- CN
- China
- Prior art keywords
- function
- hash
- interface
- java class
- interface function
- 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.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4488—Object-oriented
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本申请实施例公开一种接口方法表生成方法、函数指针查询方法及装置,该接口方法表生成方法中,基于目标Java类可实现的接口函数的数量,生成目标Java类的哈希表,再基于目标Java类的哈希算法和各个接口函数的函数签名,确定接口函数的哈希值,确定第一接口函数的函数指针在哈希表中的索引,将第一接口函数的函数指针存储至索引指示的位置,第一接口函数为与其他接口函数不存在哈希冲突的接口函数,以及将第二接口函数的函数签名和函数指针存储至冲突消除表,第二接口函数为与其他接口函数存在哈希冲突的接口函数。该方案在生成哈希表时,通过目标Java类可实现的各个接口函数的数量与预设系数的乘积确定哈希表的大小,避免哈希表出现过大或过小的问题。
Description
技术领域
本申请涉及计算机技术领域,具体涉及一种接口方法表生成方法、函数指针查询方法及装置。
背景技术
Java类支持多继承的接口机制,也就是说,一个Java类往往能够实现多个接口函数。这种情况下,为了便于Java类查询接口函数的函数指针,通常需要为Java类创建相应的接口方法表(interface method table,Itab)。
其中,每个Java类的Itab包括哈希表和冲突消除表。在为一个Java类创建Itab的过程中,首先,确定该Java类可实现的各个接口函数,并确定哈希表的大小和哈希算法;然后,通过已确定的哈希算法和各个接口函数的函数签名,分别计算所述各个接口函数的哈希值;其中,如果某一个接口函数的哈希值与其他各个接口函数的哈希值均不存在哈希冲突,则根据该接口函数的哈希值,确定该接口函数在哈希表中的索引,并将该接口函数的函数指针存储至该索引所指示的位置,以获取该Java类的哈希表;另外,若某一个接口函数的哈希值与其他接口函数的哈希值存在哈希冲突,则将该接口函数的函数签名和函数指针存储至冲突消除表,从而获取该Java类的冲突消除表,进一步获取哈希表和冲突消除表构成的Itab。
在生成Java类的Itab之后,当查询该Java类可实现的某一接口函数的函数指针时,首先通过该接口函数的函数签名和哈希算法,计算得到哈希值,根据该哈希值确定哈希表的索引,当哈希表中该索引指示的位置存储有函数指针时,则确定哈希表中存储的函数指针为该接口函数的函数指针。另外,当哈希表中该索引指示的位置未存储函数指针时,则根据该接口函数的函数签名查询冲突消除表,获取冲突消除表中存储的函数指针。
但是,发明人在本申请的研究过程中发现,在现有技术中,为不同的Java类创建Itab时,设定的哈希表的大小均为一个相同的固定值,即各个Java类的哈希表的大小均相同,但是,不同的Java类所能实现的接口函数的类别和数量通常不同,因此,根据现有技术生成的Itab往往存在对某些Java类过大,对另一些Java类过小的问题。这种情况下,当Java类的哈希表较大时,会造成存储空间的浪费,而当Java类的哈希表较小时,又会导致哈希表存储的函数指针的数量较少,相应的冲突消除表存储的函数指针的数量较多,在函数指针的查询过程中,往往需要查询到冲突消除表时,才能查询到所需的函数指针,进一步导致函数指针的查询效率下降。
发明内容
通过现有技术为不同的Java类生成接口方法表Itab时,设定的哈希表的大小均为相同的固定值,即各个Java类的哈希表的大小均相同,但是,不同的Java类所能实现的接口函数的类别和数量通常不同,因此,根据现有技术生成的Itab往往存在对某些Java类过大,对另一些Java类过小的问题。当某一Java类的哈希表较大时,会造成存储空间的浪费,而当Java类的哈希表较小时,又会导致哈希表存储的函数指针的数量较少,相应的冲突消除表存储的函数指针的数量较多,进一步导致函数指针的查询效率下降。为了解决这一问题,本申请公开一种接口方法表Itab生成方法、函数指针查询方法及装置。
第一方面,本申请实施例公开一种接口方法表生成方法,包括:
基于目标Java类可实现的各个接口函数的数量,生成所述目标Java类的哈希表,所述哈希表的大小为所述接口函数的数量与预设系数的乘积;
确定所述目标Java类的哈希算法;
基于所述目标Java类的哈希算法和所述各个接口函数的函数签名,确定所述各个接口函数的哈希值;
基于第一接口函数的哈希值和所述哈希表的大小,确定所述第一接口函数的函数指针在所述哈希表中的索引,并将所述第一接口函数的函数指针存储至所述索引指示的位置,所述第一接口函数为与其他接口函数不存在哈希冲突的接口函数;
将第二接口函数的函数签名和函数指针存储至冲突消除表,所述第二接口函数为与其他接口函数存在哈希冲突的接口函数。
本申请实施例公开的方案,解决了现有技术中存在的,哈希表过大所导致的存储空间的浪费的问题,从而能够节省存储空间,并且,解决了现有技术中存在的,哈希表过小所导致的函数指针的查询效率下降的问题,从而提高了函数指针的查询效率。
一种可选的设计中,还包括:
将所述哈希表的大小存储至所述目标Java类的元数据信息中。
在本申请实施例中,将哈希表的大小存储至所述目标Java类的元数据信息中,以便通过该元数据信息,确定目标Java类的哈希表的大小。
一种可选的设计中,所述基于第一接口函数的哈希值和所述哈希表的大小,确定所述第一接口函数的函数指针在所述哈希表中的索引,包括:
对所述第一接口函数的哈希值与所述哈希表的大小进行取余操作;
确定通过取余操作获取的余数为所述第一接口函数的函数指针在所述哈希表中的索引。
一种可选的设计中,所述确定所述目标Java类的哈希算法,包括:
分别通过各种哈希算法与所述各个接口函数的函数签名,计算所述各个接口函数的哈希值;
比较通过所述各种哈希算法得到的哈希值之间,所存在的哈希冲突的数量;
确定当哈希冲突的数量最小时,所应用的哈希算法为所述目标Java类的哈希算法。
本申请实施例公开的方案能够灵活选择目标Java类的哈希算法,这种情况下,通过目标Java类的哈希算法计算哈希值,能够减少哈希冲突,相应的,提高函数指针的查询效率,并且,还能够减少冲突消除表中存储的函数签名和函数指针,进一步减少接口方法表占用的存储空间。
一种可选的设计中,还包括:
将所述目标Java类的哈希算法的算法索引存储至所述目标Java类的元数据信息中。
在本申请实施例中,将目标Java类的哈希算法的算法索引存储至所述目标Java类的元数据信息中,以便通过该元数据信息,确定目标Java类所使用的哈希算法。
第二方面,本申请实施例公开一种函数指针查询方法,包括:
基于目标Java类的元数据信息,获取所述目标Java类的哈希表的大小;
基于所述目标Java类待实现的接口函数的函数签名,计算所述接口函数的哈希值;
基于所述哈希表的大小和所述接口函数的哈希值,确定所述接口函数的函数指针对应所述哈希表的索引;
当所述索引指示的位置存储有函数指针时,确定所述索引指示的位置存储的所述函数指针为所述接口函数的函数指针;
当所述索引指示的位置未存储函数指针时,基于所述接口函数的函数签名查询冲突消除表,通过查询结果确定所述接口函数的函数指针。
通过本申请实施例的方案查询函数指针时,所应用的哈希表的大小根据目标Java类可实现的各个接口函数的数量设定,避免哈希表出现过大或过小的问题,从而解决了现有技术中存在的,哈希表过小所导致的函数指针的查询效率下降的问题,提高了函数指针的查询效率。
一种可选的设计中,所述基于所述目标Java类待实现的接口函数的函数签名,计算所述接口函数的哈希值,包括:
查询所述目标Java类的元数据信息中包括的算法索引;
基于所述算法索引对应的哈希算法和所述目标Java类待实现的接口函数的函数签名,计算所述接口函数的哈希值。
一种可选的设计中,所述基于所述哈希表的大小和所述接口函数的哈希值,确定所述接口函数的函数指针对应所述哈希表的索引,包括:
对所述接口函数的哈希值与所述哈希表的大小进行取余操作;
确定通过取余操作获取的余数为所述接口函数的函数指针对应所述哈希表的索引。
第三方面,本申请实施例公开一种终端装置,包括:
处理器;
所述处理器用于,基于目标Java类可实现的各个接口函数的数量,生成所述目标Java类的哈希表,所述哈希表的大小为所述接口函数的数量与预设系数的乘积,确定所述目标Java类的哈希算法,基于所述目标Java类的哈希算法和所述各个接口函数的函数签名,确定所述各个接口函数的哈希值,基于第一接口函数的哈希值和所述哈希表的大小,确定所述第一接口函数的函数指针在所述哈希表中的索引,并将所述第一接口函数的函数指针存储至所述索引指示的位置,所述第一接口函数为与其他接口函数不存在哈希冲突的接口函数,将第二接口函数的函数签名和函数指针存储至冲突消除表,所述第二接口函数为与其他接口函数存在哈希冲突的接口函数。
一种可选的设计中,所述处理器还用于,将所述哈希表的大小存储至所述目标Java类的元数据信息中。
一种可选的设计中,所述处理器具体用于,对所述第一接口函数的哈希值与所述哈希表的大小进行取余操作,并确定通过取余操作获取的余数为所述第一接口函数的函数指针在所述哈希表中的索引。
一种可选的设计中,所述处理器具体用于,分别通过各种哈希算法与所述各个接口函数的函数签名,计算所述各个接口函数的哈希值,比较通过所述各种哈希算法得到的哈希值之间,所存在的哈希冲突的数量,确定当哈希冲突的数量最小时,所应用的哈希算法为所述目标Java类的哈希算法。
一种可选的设计中,所述处理器还用于,将所述目标Java类的哈希算法的算法索引存储至所述目标Java类的元数据信息中。
第四方面,本申请实施例公开一种终端装置,包括:
处理器;
所述处理器用于,基于目标Java类的元数据信息,获取所述目标Java类的哈希表的大小,基于所述目标Java类待实现的接口函数的函数签名,计算所述接口函数的哈希值,基于所述哈希表的大小和所述接口函数的哈希值,确定所述接口函数的函数指针对应所述哈希表的索引,当所述索引指示的位置存储有函数指针时,确定所述索引指示的位置存储的所述函数指针为所述接口函数的函数指针,当所述索引指示的位置未存储函数指针时,基于所述接口函数的函数签名查询冲突消除表,通过查询结果确定所述接口函数的函数指针。
一种可选的设计中,所述处理器具体用于,查询所述目标Java类的元数据信息中包括的算法索引,基于所述算法索引对应的哈希算法和所述目标Java类待实现的接口函数的函数签名,计算所述接口函数的哈希值。
一种可选的设计中,所述处理器具体用于,对所述接口函数的哈希值与所述哈希表的大小进行取余操作,确定通过取余操作获取的余数为所述接口函数的函数指针对应所述哈希表的索引。
第五方面,本申请实施例公开一种终端装置,包括:
处理器和存储器,
所述存储器,用于存储程序指令;
所述处理器,用于调用并执行所述存储器中存储的程序指令,以使所述通信装置执行本申请第一方面,以及第一方面各种可选的设计中所述的接口方法表生成方法。
第六方面,本申请实施例公开一种终端装置,包括:
处理器和存储器,
所述存储器,用于存储程序指令;
所述处理器,用于调用并执行所述存储器中存储的程序指令,以使所述通信装置执行本申请第二方面,以及第二方面各种可选的设计中所述的函数指针查询方法。
第七方面,本申请实施例公开一种计算机可读存储介质,所述计算机可读存储介质中存储有指令,当其在计算机上运行时,使得所述计算机执行本申请第一方面,以及第一方面各种可选的设计中所述的接口方法表生成方法。
第八方面,本申请实施例公开一种计算机可读存储介质,所述计算机可读存储介质中存储有指令,当其在计算机上运行时,使得所述计算机执行本申请第二方面,以及第二方面各种可选的设计中所述的函数指针查询方法。
通过本申请实施例的方案,能够获取目标Java类的哈希表和冲突消除表,相应的,获取到所述目标Java类的接口方法表。并且,该方案在生成哈希表时,通过目标Java类可实现的各个接口函数的数量与预设系数的乘积确定哈希表的大小,避免哈希表出现过大或过小的问题,因此,解决了现有技术中存在的,哈希表过大所导致的存储空间的浪费的问题,从而能够节省存储空间,并且,解决了现有技术中存在的,哈希表过小所导致的函数指针的查询效率下降的问题,从而提高了函数指针的查询效率。
进一步的,一个接口函数的函数签名所占用的存储空间通常远远大于该接口函数的函数指针所占用的存储空间。因此,目标Java类的第二接口函数的数量越多,冲突消除表中需要存储的函数签名和函数指针则越多,相应的,接口方法表所占用的存储空间则越大。据此可知,通过现有技术生成接口方法表时,当哈希表过小时,接口方法表所占用的存储空间较大。而本申请实施例公开的方案能够避免哈希表过小的问题,因此,与现有技术相比,能够减少第二接口函数的数量,相应减少冲突消除表中需要存储的函数签名和函数指针,进一步减少接口方法表所占用的存储空间。
附图说明
为了更清楚地说明本申请的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,对于本领域普通技术人员而言,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本申请实施例应用的一种接口方法表生成方法的工作流程示意图;
图2(a)为本申请实施例公开的一种哈希表的示意图;
图2(b)为本申请实施例公开的一种冲突消除表的示意图;
图3为本申请实施例应用的一种接口方法表生成方法中,确定目标Java类的哈希算法的工作流程示意图;
图4为本申请实施例应用的一种函数指针查询方法的工作流程示意图;
图5为本申请实施例应用的一种终端装置的结构示意图。
具体实施方式
通过现有技术为不同的Java类生成接口方法表Itab时,设定的哈希表的大小均为相同的固定值,即各个Java类的哈希表的大小均相同,但是,不同的Java类所能实现的接口函数的类别和数量通常不同,因此,根据现有技术生成的Itab往往存在对某些Java类过大,对另一些Java类过小的问题。当某一Java类的哈希表较大时,会造成存储空间的浪费,而当Java类的哈希表较小时,又会导致哈希表存储的函数指针的数量较少,相应的冲突消除表存储的函数指针的数量较多,进一步导致函数指针的查询效率下降。为了解决这一问题,本申请通过以下各个实施例公开一种接口方法表Itab生成方法、函数指针查询方法及装置。
参见图1所示的工作流程示意图,本申请实施例公开一种接口方法表生成方法,该方法包括以下步骤:
步骤S11、基于目标Java类可实现的各个接口函数的数量,生成所述目标Java类的哈希表,所述哈希表的大小为所述接口函数的数量与预设系数的乘积。
Java类的接口机制为多继承机制,即一个Java类往往能够实现多个接口函数,而且,不同的Java类所能实现的接口函数的种类和数量往往不同,因此,本申请需要通过步骤S11确定目标Java类可实现的各个接口函数的数量。
另外,在本申请实施例中,目标Java类指的是需要生成接口方法表的Java类。所述哈希表的大小指的是哈希表中能够存储的函数指针的数量,例如,当某一个哈希表能够存储40个函数指针时,则认为该哈希表的大小为40。
上述步骤中,所述预设系数为大于1的正数,设定预设系数为N,则通过步骤S11,能够使目标Java类的哈希表的大小为目标Java类能实现的各个接口函数的数量的N倍。
步骤S12、确定所述目标Java类的哈希算法。
哈希算法往往包括多种,例如,哈希算法包括DJBHash算法、BKDRHash算法、RSHash算法和SDBMHash算法等多种。本申请实施例中,通过步骤S12,确定所述目标Java类的哈希算法。
步骤S13、基于所述目标Java类的哈希算法和所述各个接口函数的函数签名,确定所述各个接口函数的哈希值。
其中,通过所述目标Java类的哈希算法,对所述各个接口函数的函数签名进行哈希计算,得到的结果即为所述各个接口函数的哈希值。
另外,接口函数的函数签名中通常包括该接口函数的相关信息,用于区分不同的接口函数。例如,函数签名可以包括该接口函数的函数名、参数类型和参数个数等,本申请实施例对此不做限定。
步骤S14、基于第一接口函数的哈希值和所述哈希表的大小,确定所述第一接口函数的函数指针在所述哈希表中的索引,并将所述第一接口函数的函数指针存储至所述索引指示的位置,所述第一接口函数为与其他接口函数不存在哈希冲突的接口函数。
在本申请实施例中,根据接口函数的哈希值和哈希表的大小,确定该接口函数的函数指针在哈希表中的索引,这种情况下,如果两个接口函数的函数指针在哈希表中的索引相同,则认为这两个接口函数存在哈希冲突,如果两个接口函数的函数指针在哈希表中的索引不同,则认为这两个接口函数不存在哈希冲突。
另外,在本申请实施例中,通过各个接口函数是否与其他接口函数存在哈希冲突,将各个接口函数分为两类,分别为第一接口函数和第二接口函数。其中,所述第一接口函数为与其他接口函数不存在哈希冲突的接口函数,第二接口函数为与其他接口函数存在哈希冲突的接口函数。
由于第一接口函数与其他接口函数均不存在哈希冲突,也就是说,第一接口函数的函数指针在哈希表中的索引与其他接口函数不同,因此,可将第一接口函数的函数指针存储至所述索引指示的位置。这种情况下,存储有各个第一接口函数的函数指针的哈希表,即为所述目标Java类的接口方法表中的哈希表。
步骤S15、将第二接口函数的函数签名和函数指针存储至冲突消除表,所述第二接口函数为与其他接口函数存在哈希冲突的接口函数。
由于第二接口函数与其他接口函数存在哈希冲突,如果将第二接口函数的函数指针也存储至哈希表中,则哈希表中同一位置需要至少存储两个函数指针,导致后续查询函数指针时,无法通过哈希表准确的查询到所需的函数指针。因此,需要将第二接口函数的函数签名和函数指针存储至冲突消除表。这种情况下,存储有各个第二接口函数的函数签名和函数指针的冲突消除表,即为所述目标Java类的接口方法表中的冲突消除表。
例如,假设第一目标Java类可实现三个接口函数,其中第一接口函数与第二接口函数和第三接口函数均不存在哈希冲突,就将第一接口函数的函数指针存储至第一目标Java类的哈希表中,而第二接口函数和第三接口函数之间存在哈希冲突,则将第二接口函数和第三接口函数的函数签名和函数指针分别存储至冲突消除表中。
通过步骤S14获取到的哈希表,以及通过步骤S15获取到的冲突消除表,构成目标Java类的接口方法表。
另外,在查询函数指针时,通过第二接口函数的函数签名对冲突消除表进行查询,即可查找到第二接口函数的函数指针。
不同的Java类能够实现的接口函数的种类和数量往往不同,例如,第一Java类可实现10个接口函数,第二Java类可实现24个接口函数。但是,现有技术在为每个Java类生成接口方法表时,接口方法表中的哈希表的大小均为一个相同的固定值,也就是说,在现有技术中,各个Java类的哈希表的大小均相同。例如,现有技术设置第一Java类和第二Java类的哈希表的大小均为40。这种情况下,如果通过现有技术生成接口方法表,对于某些Java类来说,接口方法表中的哈希表较大,而对于某些Java类来说,接口方法表中的哈希表较小。
其中,当某一Java类的哈希表较大时,会造成存储空间的浪费。而当某一Java类的哈希表较小时,该哈希表能够存储的函数指针较少,相应的,需要在冲突消除表中存储较多的函数指针,而在查询某一接口函数的函数指针时,先查询哈希表,当哈希表中未存储该接口函数的函数指针时,再查询冲突消除表。因此,当哈希表存储的函数指针较少,而冲突消除表中存储的函数指针较多时,往往需要查询到冲突消除表时,才能查询到所需的函数指针,从而导致函数指针的查询效率下降。
通过本申请实施例的方案,能够获取目标Java类的哈希表和冲突消除表,相应的,获取到所述目标Java类的接口方法表。并且,该方案在生成哈希表时,通过目标Java类可实现的各个接口函数的数量与预设系数的乘积确定哈希表的大小,避免哈希表出现过大或过小的问题,因此,解决了现有技术中存在的,哈希表过大所导致的存储空间的浪费的问题,从而能够节省存储空间,并且,解决了现有技术中存在的,哈希表过小所导致的函数指针的查询效率下降的问题,从而提高了函数指针的查询效率。
进一步的,一个接口函数的函数签名所占用的存储空间通常远远大于该接口函数的函数指针所占用的存储空间。因此,目标Java类的第二接口函数的数量越多,冲突消除表中需要存储的函数签名和函数指针则越多,相应的,接口方法表所占用的存储空间则越大。据此可知,通过现有技术生成接口方法表时,当哈希表过小时,接口方法表所占用的存储空间较大。而本申请实施例公开的方案能够避免哈希表过小的问题,因此,与现有技术相比,能够减少第二接口函数的数量,相应减少冲突消除表中需要存储的函数签名和函数指针,进一步减少接口方法表所占用的存储空间。
另外,在本申请实施例中,所述预设系数N为大于1的正数,在一种可行的实现方式中,可设置所述预设系数N为2,这种情况下,目标Java类的哈希表的大小为目标Java类可实现的各个接口函数的数量的2倍。例如,当第一Java类可实现10个接口函数时,第一Java类的哈希表的大小为20,即该哈希表能够存储20个函数指针。
进一步的,在本申请实施例中,通过步骤S11至步骤S15,公开一种接口方法表生成方法。该方法在实际应用过程中,步骤S14至步骤S15的操作过程并无严格的时间顺序,例如,还可以先执行步骤S15的操作,再执行步骤S14的操作,或者,同时执行步骤S14和步骤S15的操作,本申请实施例对此不做限定。
为了明确本申请实施例生成的接口方法表的形式,以下还公开了图2(a)和图2(b),其中,图2(a)为接口方法表中的哈希表,图2(b)为接口方法表中的冲突消除表。
在本申请实施例的方案中,通过接口函数之间是否存在哈希冲突,将目标Java类可实现的接口函数分为第一接口函数和第二接口函数。其中,第一接口函数与其他接口函数均不存在哈希冲突,第二接口函数与其他接口函数存在哈希冲突。在图2(a)所示的哈希表中,存储第一接口函数的函数指针,在图2(b)所示的冲突消除表中,存储第二接口函数的函数签名和函数指针。
另外,当哈希表中某一位置未存储函数指针,即各个第一接口函数的函数指针在哈希表中的索引均不是该位置的索引时,该位置保持为哈希表的初始值,其中,该初始值通常为0。
进一步的,在本申请实施例公开的方案中,还包括以下步骤:
将所述哈希表的大小存储至所述目标Java类的元数据信息中。
目标Java类的元数据信息,用于存储目标Java类的属性。在现有技术中,由于不同Java类的哈希表的大小均相同,因此,无需在Java类的元数据信息中存储该Java类的哈希表的大小。而本申请实施例的方法,根据目标Java类可实现的接口函数的数量,灵活调整哈希表的大小,即针对不同的目标Java类来说,哈希表的大小是可变的。因此,在本申请实施例中,还可以将哈希表的大小存储至所述目标Java类的元数据信息中,以便通过该元数据信息,确定目标Java类的哈希表的大小。
在本申请实施例公开的方案中,包括基于第一接口函数的哈希值和所述哈希表的大小,确定所述第一接口函数的函数指针在所述哈希表中的索引的操作,该操作包括以下步骤:
对所述第一接口函数的哈希值与所述哈希表的大小进行取余操作;
确定通过取余操作获取的余数为所述第一接口函数的函数指针在所述哈希表中的索引。
其中,在进行取余操作的过程中,第一接口函数的哈希值为被除数,哈希表的大小为除数。
这种情况下,当所述第一接口函数的哈希值不大于所述哈希表的大小时,通过取余操作获取的余数即为第一接口函数的哈希值,也就是说,第一接口函数的函数指针在所述哈希表中的索引为第一接口函数的哈希值。
例如,哈希表的大小为20,即该哈希表能够存储20个函数指针,当第一接口函数的哈希值为10时,则第一接口函数的函数指针在哈希表中的索引为10,需要将第一接口函数的函数指针存储在哈希表的索引为10的位置;另外,当第一接口函数的哈希值为23时,通过取余操作,获取到的余数为3,则第一接口函数的函数指针在所述哈希表中的索引为3,需要将第一接口函数的函数指针存储在哈希表的索引为3的位置。
另外,在本申请实施例中,如果两个接口函数的函数指针在哈希表中的索引相同,则认为这两个接口函数存在哈希冲突,如果两个接口函数的函数指针在哈希表中的索引不同,则认为这两个接口函数不存在哈希冲突。而根据上述步骤可知,接口函数的函数指针在哈希表中的索引可通过对第一接口函数的哈希值与哈希表的大小进行取余操作获取。这种情况下,当对两个接口函数的哈希值与哈希表的大小进行取余操作之后,获取到的余数相同,则认为这两个接口函数存在哈希冲突。
例如,当哈希表的大小为20时,如果接口函数a的哈希值为3,接口函数b的哈希值为23,则接口函数a与接口函数b进行取余操作之后,获取到的余数相同,这种情况下,可确定接口函数a与接口函数b存在哈希冲突。
另外,上述步骤中,公开确定所述目标Java类的哈希算法的操作,该操作可通过多种方式实现。
在其中一种实现方式中,将预先设置的哈希算法作为目标Java类的哈希算法,也就是说,该方案中,预先为目标Java类设置相应的哈希算法。
在另外一种实现方式中,参见图3所示的工作流程示意图,该操作包括以下步骤:
步骤S121、分别通过各种哈希算法与所述各个接口函数的函数签名,计算所述各个接口函数的哈希值。
哈希算法往往包括多种,例如,哈希算法包括DJBHash算法、BKDRHash算法、RSHash算法和SDBMHash算法等。在步骤S121中,分别通过各种哈希算法与各个接口函数的函数签名,计算各个接口函数的哈希值。
步骤S122、比较通过所述各种哈希算法得到的哈希值之间,所存在的哈希冲突的数量。
步骤S123、确定当哈希冲突的数量最小时,所应用的哈希算法为所述目标Java类的哈希算法。
例如,当应用DJBHash这一哈希算法时,哈希冲突的数量最小,则确定DJBHash为目标Java类的哈希算法。
在现有技术中,不同的Java类计算接口函数的哈希值时,采用的哈希算法相同。但是,不同的Java类所能实现的接口函数的种类和数量往往不同。这种情况下,不同的Java类使用相同的哈希算法,对减少哈希冲突不利。也就是说,对于各种Java类均采用同一哈希算法,而该哈希算法可能对某些Java类不适用,从而导致某些Java类出现较多的哈希冲突。而哈希冲突越多,冲突消除表中存储的函数签名和函数指针越多,不利于函数指针的查询,从而会降低函数指针的查询效率。并且,冲突消除表中存储的函数签名和函数指针越多,该Java类的接口方法表所占用的存储空间越大。
为了解决这一问题,本申请实施例公开了步骤S121至步骤S123的方案,该方案中,分别通过各种哈希算法计算各个接口函数的哈希值,然后确定其中哈希冲突的数量最小时,所应用的哈希算法为目标Java类的哈希算法。与现有技术相比,本申请实施例公开的方案能够灵活选择目标Java类的哈希算法,这种情况下,通过目标Java类的哈希算法计算哈希值,能够减少哈希冲突,相应的,提高函数指针的查询效率,并且,还能够减少冲突消除表中存储的函数签名和函数指针,进一步减少接口方法表占用的存储空间。
进一步的,在本申请实施例公开的方案中,还包括以下步骤:
将所述目标Java类的哈希算法的算法索引存储至所述目标Java类的元数据信息中。
目标Java类的元数据信息,用于存储目标Java类的属性。在现有技术中,由于不同Java类应用的哈希算法均相同,因此,无需在Java类的元数据信息中存储该Java类的哈希算法的算法索引。而本申请实施例的方法中,从各种哈希算法中,确定使哈希冲突的数量最小的哈希算法为所述目标Java类的哈希算法,从而能够灵活选择哈希算法,即针对不同的目标Java类来说,所采用的哈希算法是可变的。因此,在本申请实施例中,还可以将目标Java类的哈希算法的算法索引存储至所述目标Java类的元数据信息中,以便通过该元数据信息,确定目标Java类所使用的哈希算法。
其中,哈希算法的算法索引用于区分不同的哈希算法,不同哈希算法的算法索引不同。具体的,哈希算法的算法索引可以是数字或字母等字符,即每一种哈希算法分别对应一个字符,不同的哈希算法对应不同的字符,从而能够根据存储在元数据信息中的算法索引,确定目标Java类的哈希算法。当然,哈希算法的算法索引还可以为其他形式,本申请实施例对此不做限定。
进一步的,本申请实施例中,所应用的哈希算法可以为一级哈希算法或多级哈希算法。其中,一级哈希算法指的是,在计算哈希值时,只进行一次哈希计算;而多级哈希算法指的是,在计算哈希值时进行多次哈希计算,并且,在进行多次哈希计算时,第一次哈希计算是对接口函数的函数签名进行计算,而后续的每一个哈希计算,是对上一次哈希计算得到的结果再次进行计算。另外,在进行多级哈希算法时,所采用的各级哈希算法可相同,也可以不同,本申请实施例对此不做限定。
例如,本申请实施例中,可对目标Java类采用二级哈希算法,二级哈希算法中的第一级哈希算法为DJBHash算法,第二级哈希算法为BKDRHash算法,这种情况下,先通过DJBHash算法对各个接口函数的函数签名进行计算,获取相应的哈希值,然后,再通过BKDRHash算法对通过DJBHash算法获取到的哈希值进行计算,获取到的结果即为各个接口函数的哈希值。
通过多级哈希计算,能够减少哈希冲突的数量,从而减少冲突消除表中存储的函数签名和函数指针,减少接口方法表占用的存储空间,并提高函数指针的查询效率。
另外,当本申请实施例中,对目标Java类采用的哈希算法为多级哈希算法时,则目标Java类的哈希算法的算法索引也包括多个。例如,当对目标Java类采用二级哈希算法,二级哈希算法中的第一级哈希算法为DJBHash算法,第二级哈希算法为BKDRHash算法时,则目标Java类的哈希算法的算法索引包括DJBHash算法和BKDRHash算法这两种哈希算法的算法索引。
为了体现本申请实施例所公开的方案的优势,以下公开一个具体的示例。
在该示例中,设定存在第一目标Java类和第二目标Java类,其中,第一目标Java类能够实现以下10个接口函数:
1、"apply|()";
2、"putString|(Ljava/lang/String;Ljava/lang/String;)";
3、"putInt|(Ljava/lang/String;I)";
4、"clear|()";
5、"remove|(Ljava/lang/String;)";
6、"putStringSet|(Ljava/lang/String;Ljava/util/Set;)";
7、"putLong|(Ljava/lang/String;J)";
8、"commit|()";
9、"putFloat|(Ljava/lang/String;F)";
10、"putBoolean|(Ljava/lang/String;Z)"。
另外,第二目标Java类能够实现以下24个接口函数:
1、"comparingLong|(Ljava/util/function/ToLongFunction;)";
2、"thenComparing|(Ljava/util/function/Function;Ljava/util/Comparator;)";
3、"reversed|()";
4、"lambda$comparingDouble$8dcf42ea$1|(Ljava/util/function/ToDoubleFunction;Ljava/lang/Object;Ljava/lang/Object;)";
5、"thenComparing|(Ljava/util/function/Function;)";
6、"lambda$comparing$ea9a8b3a$1|(Ljava/util/Comparator;Ljava/util/function/Function;Ljava/lang/Object;Ljava/lang/Object;)";
7、"comparingInt|(Ljava/util/function/ToIntFunction;)";
8、"compare|(Ljava/lang/Object;Ljava/lang/Object;)";
9、lambda$thenComparing$36697e65$1|(Ljava/util/Comparator;Ljava/util/Comparator;Ljava/lang/Object;Ljava/lang/Object;)";
10、"naturalOrder|()";
11、"thenComparing|(Ljava/util/Comparator;)";
12、lambda$comparing$77a9974f$1|(Ljava/util/function/Function;Ljava/lang/Object;Ljava/lang/Object;)";
13、"comparing|(Ljava/util/function/Function;)";
14、"reverseOrder|()";
15、"lambda$comparingInt$7b0bb60$1|(Ljava/util/function/ToIntFunction;Ljava/lang/Object;Ljava/lang/Object;)";
16、"thenComparingInt|(Ljava/util/function/ToIntFunction;)";
17、"comparing|(Ljava/util/function/Function;Ljava/util/Comparator;)";
18、"comparingDouble|(Ljava/util/function/ToDoubleFunction;)";
19、"nullsFirst|(Ljava/util/Comparator;)";
20、"nullsLast|(Ljava/util/Comparator;)";
21、"equals|(Ljava/lang/Object;)";
22、"thenComparingDouble|(Ljava/util/function/ToDoubleFunction;)";
23、"thenComparingLong|(Ljava/util/function/ToLongFunction;)";
24、"lambda$comparingLong$6043328a$1|(Ljava/util/function/ToLongFunction;Ljava/lang/Object;Ljava/lang/Object;)"。
通过现有技术生成接口方法表时,第一目标Java类和第二目标Java类的哈希表的大小相同,通常为40,即第一目标Java类和第二目标Java类的哈希表均能存储40个函数指针,并且,第一目标Java类和第二目标Java类采用的哈希算法相同,均为DJBHash算法。
这种情况下,通过DJBHash算法进行哈希计算后发现,第一目标Java类的10个接口函数中,有6个接口函数的哈希值不冲突,4个接口函数的哈希值出现哈希冲突,即第一目标Java类的冲突消除表中需要存储4个接口函数的函数签名和函数指针。如果每个函数指针为8Bytes,并且,每个函数签名为8Bytes,由于第一目标Java类的哈希表中能够存储40个函数指针,则哈希表占用的存储空间为40*8=320Bytes,另外,由于冲突消除表中存储4个接口函数的函数签名和函数指针,则冲突消除表占用的存储空间为4*2*8=64Bytes。另外,现有技术中,无需在第一目标Java类的元数据信息中存储哈希表的大小和哈希算法的算法索引,则元数据信息的增加值为0Bytes。
另外,通过DJBHash进行哈希计算后发现,第二目标Java类的24个接口函数中,有4个接口函数的哈希值不冲突,20个接口函数的哈希值出现哈希冲突,即第二目标Java类的冲突消除表中需要存储20个接口函数的函数签名和函数指针。如果每个函数指针为8Bytes,并且,每个函数签名为8Bytes,由于第二目标Java类的哈希表中能够存储40个函数指针,则哈希表的占用的存储空间为40*8=320Bytes,另外,由于第二目标Java类的冲突消除表中存储20个接口函数的函数签名和函数指针,则冲突消除表占用的存储空间为20*2*8=320Bytes。另外,现有技术中,无需在第二目标Java类的元数据信息中存储哈希表的大小和哈希算法的算法索引,则元数据信息的增加值为0Bytes。
据此,可以确定,在现有技术中,第一目标Java类和第二目标Java类的接口方法表所占用的存储空间一共为320+64+320+320=1024Bytes,并且,共有24个接口函数的哈希值出现哈希冲突。
当通过本申请实施例公开的方案为第一目标Java类和第二目标Java类生成接口方法表时,哈希表的大小为接口函数的数量与预设系数N的乘积,其中,N可以为2,则第一目标Java类和第二目标Java类的哈希表的大小分别为第一目标Java类和第二目标Java类可实现的接口函数的数量的2倍,即第一目标Java类的哈希算法的大小为20,第二目标Java类的哈希表的大小为48。另外,通过各种哈希算法,例如DJBHash算法、BKDRHash算法、RSHash算法和SDBMHash算法等,分别计算第一目标Java类和第二目标Java类可实现的各个接口函数的哈希值,并选择哈希冲突数量最小时,所应用的哈希算法分别为第一目标Java类和第二目标Java类的哈希算法。
这种情况下,将第一目标Java类的哈希冲突数量最小时,所应用的哈希算法作为第一目标Java类的最优算法,则经过第一目标Java类的最优算法的哈希计算,确定第一目标Java类的10个接口函数中,有8个接口函数的哈希值不冲突,2个接口函数的哈希值出现哈希冲突,即第一目标Java类的冲突消除表中需要存储2个接口函数的函数签名和函数指针。如果每个函数指针为8Bytes,并且,每个函数签名为8Bytes,由于第一目标Java类的哈希表为第一目标Java类所能实现的接口函数的数量的2倍,则哈希表占用的存储空间为10*2*8=160Bytes,另外,由于冲突消除表中存储2个接口函数的函数签名和函数指针,则冲突消除表的大小为2*2*8=32Bytes。另外,本申请还需要在第一目标Java类的元数据信息中存储哈希表的大小和哈希算法的算法索引,则元数据信息还需要增加4Bytes,该4Bytes为哈希表的大小和哈希算法的算法索引在元数据信息中所占用的存储空间。
将第二目标Java类的哈希冲突数量最小时,所应用的哈希算法作为第二目标Java类的最优算法,则经过第二目标Java类的最优算法的哈希计算,确定第二目标Java类的24个接口函数中,有18个接口函数的哈希值不冲突,6个接口函数的哈希值出现哈希冲突,即第二目标Java类的冲突消除表中需要存储2个接口函数的函数签名和函数指针。如果每个函数指针为8Bytes,并且,每个函数签名为8Bytes,由于第二目标Java类的哈希表为第二目标Java类所能实现的接口函数的数量的2倍,则第二目标Java类的哈希表占用的存储空间为24*2*8=384Bytes,另外,由于冲突消除表中存储6个接口函数的函数签名和函数指针,则冲突消除表的大小为6*2*8=96Bytes。另外,本申请还需要在第二目标Java类的元数据信息中存储哈希表的大小和哈希算法的算法索引,则元数据信息还需要增加4Bytes,该4Bytes为哈希表的大小和哈希算法的算法索引在元数据信息中所占用的存储空间。
据此,可以确定,通过本申请实施例公开的方案,第一目标Java类和第二目标Java类的接口方法表所占用的存储空间一共为260+324+4+384+96+4=680Bytes,并且,共有8个接口函数的哈希值出现哈希冲突。
据此,可得到如下关于现有技术和本申请方案所占用的存储空间的表格:
根据上述描述与上述表格,可以确定,将本申请方案与现有技术方案相对比,本申请的方案节省的存储空间为1024-680=344Bytes,极大减少了接口方法表对存储空间的占用。
另外,现有技术中,第一目标Java类和第二目标Java类一共出现了24个哈希冲突,而本申请的方案中,第一目标Java类和第二目标Java类一共出现了8个哈希冲突,假设第一目标Java类和第二目标Java类对各个接口函数的访问频率相同,则本申请实施例减少了67%(即(24-8)/24)哈希冲突所导致的查询操作,极大提高了函数指针的查询效率。
相应的,与上述实施例公开的接口方法表的生成方法相对应的,本申请实施例还公开一种函数指针查询方法,以实现在上述实施例生成的接口方法表中查询函数指针。
参见图4所示的工作流程示意图,本申请实施例公开的函数指针查询方法包括以下步骤:
步骤S21、基于目标Java类的元数据信息,获取所述目标Java类的哈希表的大小。
本申请实施例中,接口方法表中的哈希表的大小可灵活调节,即不同目标Java类的哈希表的大小可能不同,并且,目标Java类的元数据信息中存储有目标Java类的哈希表的大小。这种情况下,通过查询目标Java类的元数据信息,可获取所述元数据信息中存储的目标Java类的哈希表的大小。
步骤S22、基于所述目标Java类待实现的接口函数的函数签名,计算所述接口函数的哈希值。
具体的,在该步骤中,首先确定目标Java类在计算哈希值时采用的哈希算法,然后通过该哈希算法和接口函数的函数签名,计算得到接口函数的哈希值。
另外,由于Java类支持多继承机制,也就是说,一个Java类往往能够实现多个接口函数。其中,所述目标Java类待实现的接口函数,指的是当前目标Java类所需实现的接口函数,该接口函数为所述目标Java类能够实现的多个接口函数中的一个或多个。
步骤S23、基于所述哈希表的大小和所述接口函数的哈希值,确定所述接口函数的函数指针对应所述哈希表的索引。
步骤S24、当所述索引指示的位置存储有函数指针时,确定所述索引指示的位置存储的所述函数指针为所述接口函数的函数指针。
在接口方法表的生成过程中,当某一个接口函数与其他接口函数不存在哈希冲突时,会将该接口函数的函数指针存储至哈希表中。这种情况下,该索引指示的位置中,会存储有函数指针,并且,该函数指针即为所述接口函数的函数指针。
步骤S25、当所述索引指示的位置未存储函数指针时,基于所述接口函数的函数签名查询冲突消除表,通过查询结果确定所述接口函数的函数指针。
在接口方法表的生成过程中,当某一个接口函数与其他接口函数存在哈希冲突时,会将接口函数的函数指针存储至冲突消除表中。这种情况下,哈希表中所述索引指示的位置未存储有函数指针,从而需要查询冲突消除表。
另外,在冲突消除表中,分别存储有接口函数的函数签名和函数指针,因此,通过接口函数的函数签名,即可查询到该接口函数的函数指针。
通过步骤S21至步骤S25的操作,能够查询到接口方法表中的函数指针。
在现有技术中,每个Java类的接口方法表中的哈希表的大小均为一个相同的固定值,也就是说,在现有技术中,各个Java类的哈希表的大小均相同,因此,对于不同Java类来说,通过现有技术生成的哈希表存在过大或过小的问题。其中,当某一Java类的哈希表较大时,会造成存储空间的浪费。而当某一Java类的哈希表较小时,该哈希表能够存储的函数指针较少,相应的,需要在冲突消除表中存储较多的函数指针,而在查询某一接口函数的函数指针时,先查询哈希表,当哈希表中未存储该接口函数的函数指针时,再查询冲突消除表。因此,当哈希表存储的函数指针较少,而冲突消除表中存储的函数指针较多时,往往需要查询到冲突消除表时,才能查询到所需的函数指针,从而导致函数指针的查询效率下降。
而通过本申请实施例的方案查询函数指针时,所应用的哈希表的大小根据目标Java类可实现的各个接口函数的数量设定,避免哈希表出现过大或过小的问题,从而解决了现有技术中存在的,哈希表过小所导致的函数指针的查询效率下降的问题,提高了函数指针的查询效率。
在步骤S22中,公开了基于所述目标Java类待实现的接口函数的函数签名,计算所述接口函数的哈希值的操作。该步骤中,应用的哈希算法可以为预先为目标Java类设定的哈希算法。另外,还可以通过查询目标Java类的元数据信息,确定目标Java类应用的哈希算法。
这种情况下,本申请实施例中,所述基于所述目标Java类待实现的接口函数的函数签名,计算所述接口函数的哈希值,包括以下步骤:
查询所述目标Java类的元数据信息中包括的算法索引;
基于所述算法索引对应的哈希算法和所述目标Java类待实现的接口函数的函数签名,计算所述接口函数的哈希值。
不同的目标Java类可采用不同的哈希算法,并且,各个目标Java类采用的哈希算法的算法索引被存储至该目标Java类的元数据信息,这种情况下,通过查询元数据信息,即可获取该目标Java类的哈希算法,继而可通过该目标Java类的哈希算法,计算得到接口函数的哈希值。
在步骤S23中,公开基于所述哈希表的大小和所述接口函数的哈希值,确定所述接口函数的函数指针对应所述哈希表的索引的操作。该操作通常包括以下步骤:
对所述接口函数的哈希值与所述哈希表的大小进行取余操作;
确定通过取余操作获取的余数为所述接口函数的函数指针对应所述哈希表的索引。
其中,在对所述接口函数的哈希值与所述哈希表的大小进行取余操作的过程中,接口函数的哈希值为被除数,哈希表的大小为除数。
通过上述操作,即可通过哈希表的大小和接口函数的哈希值,确定接口函数的函数指针对应哈希表的索引。
下述为本申请装置实施例,可以用于执行本申请方法实施例。对于本申请装置实施例中未披露的细节,请参照本申请方法实施例。
在本申请实施例中,公开一种终端装置,所述终端终端包括处理器。
其中,所述处理器用于,基于目标Java类可实现的各个接口函数的数量,生成所述目标Java类的哈希表,所述哈希表的大小为所述接口函数的数量与预设系数的乘积,确定所述目标Java类的哈希算法,基于所述目标Java类的哈希算法和所述各个接口函数的函数签名,确定所述各个接口函数的哈希值,基于第一接口函数的哈希值和所述哈希表的大小,确定所述第一接口函数的函数指针在所述哈希表中的索引,并将所述第一接口函数的函数指针存储至所述索引指示的位置,所述第一接口函数为与其他接口函数不存在哈希冲突的接口函数,将第二接口函数的函数签名和函数指针存储至冲突消除表,所述第二接口函数为与其他接口函数存在哈希冲突的接口函数。
通过本申请实施例的终端装置,能够获取目标Java类的哈希表和冲突消除表,相应的,获取到所述目标Java类的接口方法表。并且,该终端装置在生成哈希表时,通过目标Java类可实现的各个接口函数的数量与预设系数的乘积确定哈希表的大小,避免哈希表出现过大或过小的问题,因此,解决了现有技术中存在的,哈希表过大所导致的存储空间的浪费的问题,从而能够节省存储空间,并且,解决了现有技术中存在的,哈希表过小所导致的函数指针的查询效率下降的问题,从而提高了函数指针的查询效率。
进一步的,一个接口函数的函数签名所占用的存储空间通常远远大于该接口函数的函数指针所占用的存储空间。因此,目标Java类的第二接口函数的数量越多,冲突消除表中需要存储的函数签名和函数指针则越多,相应的,接口方法表所占用的存储空间则越大。据此可知,通过现有技术生成接口方法表时,当哈希表过小时,接口方法表所占用的存储空间较大。而本申请实施例公开的终端装置能够避免哈希表过小的问题,因此,与现有技术相比,能够减少第二接口函数的数量,相应减少冲突消除表中需要存储的函数签名和函数指针,进一步减少接口方法表所占用的存储空间。
进一步的,所述处理器还用于,将所述哈希表的大小存储至所述目标Java类的元数据信息中。
进一步的,所述处理器具体用于,对所述第一接口函数的哈希值与所述哈希表的大小进行取余操作,并确定通过取余操作获取的余数为所述第一接口函数的函数指针在所述哈希表中的索引。
其中,在进行取余操作的过程中,第一接口函数的哈希值为被除数,哈希表的大小为除数。
这种情况下,当所述第一接口函数的哈希值不大于所述哈希表的大小时,通过取余操作获取的余数即为第一接口函数的哈希值,也就是说,第一接口函数的函数指针在所述哈希表中的索引为第一接口函数的哈希值。
进一步的,所述处理器具体用于,分别通过各种哈希算法与所述各个接口函数的函数签名,计算所述各个接口函数的哈希值,比较通过所述各种哈希算法得到的哈希值之间,所存在的哈希冲突的数量,确定当哈希冲突的数量最小时,所应用的哈希算法为所述目标Java类的哈希算法。
本申请实施例公开的终端装置,分别通过各种哈希算法计算各个接口函数的哈希值,然后确定其中哈希冲突的数量最小时,所应用的哈希算法为目标Java类的哈希算法。与现有技术相比,本申请实施例公开的终端装置能够灵活选择目标Java类的哈希算法,这种情况下,通过目标Java类的哈希算法计算哈希值,能够减少哈希冲突,相应的,提高函数指针的查询效率,并且,还能够减少冲突消除表中存储的函数签名和函数指针,进一步减少接口方法表占用的存储空间。
进一步的,所述处理器还用于,将所述目标Java类的哈希算法的算法索引存储至所述目标Java类的元数据信息中。这种情况下,通过该元数据信息,即可确定目标Java类所使用的哈希算法。
相应的,在本申请另一实施中,公开一种终端装置,该终端装置用于在上述实施例生成的接口方法表中查询函数指针。
本申请实施例公开的终端装置包括:处理器。
所述处理器用于,基于目标Java类的元数据信息,获取所述目标Java类的哈希表的大小,基于所述目标Java类待实现的接口函数的函数签名,计算所述接口函数的哈希值,基于所述哈希表的大小和所述接口函数的哈希值,确定所述接口函数的函数指针对应所述哈希表的索引,当所述索引指示的位置存储有函数指针时,确定所述索引指示的位置存储的所述函数指针为所述接口函数的函数指针,当所述索引指示的位置未存储函数指针时,基于所述接口函数的函数签名查询冲突消除表,通过查询结果确定所述接口函数的函数指针。
本申请实施例公开的终端装置在查询函数指针时,所应用的哈希表的大小根据目标Java类可实现的各个接口函数的数量设定,避免哈希表出现过大或过小的问题,从而解决了现有技术中存在的,哈希表过小所导致的函数指针的查询效率下降的问题,提高了函数指针的查询效率。
进一步的,所述处理器具体用于,查询所述目标Java类的元数据信息中包括的算法索引,基于所述算法索引对应的哈希算法和所述目标Java类待实现的接口函数的函数签名,计算所述接口函数的哈希值。
不同的目标Java类可采用不同的哈希算法,并且,各个目标Java类采用的哈希算法的算法索引被存储至该目标Java类的元数据信息,这种情况下,通过查询元数据信息,即可获取该目标Java类的哈希算法,继而可通过该目标Java类的哈希算法,计算得到接口函数的哈希值。
进一步的,所述处理器具体用于,对所述接口函数的哈希值与所述哈希表的大小进行取余操作,确定通过取余操作获取的余数为所述接口函数的函数指针对应所述哈希表的索引。
其中,在对所述接口函数的哈希值与所述哈希表的大小进行取余操作的过程中,接口函数的哈希值为被除数,哈希表的大小为除数。这种情况下,即可通过哈希表的大小和接口函数的哈希值,确定接口函数的函数指针对应哈希表的索引。
相应的,在本申请另一实施例中,还公开一种终端装置,参见图5所示的结构示意图,所述终端装置包括:
处理器1101和存储器,
所述存储器,用于存储程序指令;
所述处理器,用于调用并执行所述存储器中存储的程序指令,以使所述通信装置执行图1和图3对应的实施例中的全部或部分步骤。
进一步的,该终端装置还可以包括:收发器1102和总线1103,所述存储器包括随机存取存储器1104和只读存储器1105。
其中,处理器通过总线分别耦接收发器、随机存取存储器以及只读存储器。其中,当需要运行该终端装置时,通过固化在只读存储器中的基本输入输出系统或者嵌入式系统中的bootloader引导系统进行启动,引导该终端装置进入正常运行状态。在该终端装置进入正常运行状态后,在随机存取存储器中运行应用程序和操作系统,从而使所述终端装置执行图1和图3对应的实施例中的全部或部分步骤。
本发明实施例的终端装置可对应于上述图1和图3所对应的实施例中的终端装置,并且,该终端装置中的处理器可以实现图1和图3所对应的实施例中的终端装置所具有的功能和/或所实施的各种步骤和方法,为了简洁,在此不再赘述。
本申请实施例中的处理器可通过多种方式实现。示例性的,所述处理器可为处理单元,或者,也可为其他具有处理功能的模块。
需要说明的是,本实施例也可以基于通用的物理服务器结合网络功能虚拟化(英文:Network Function Virtualization,NFV)技术实现的终端装置,所述终端装置为虚拟终端装置(如,虚拟主机、虚拟路由器或虚拟交换机)。所述虚拟终端装置可以是运行有用于生成接口方法表的程序的虚拟机(英文:Virtual Machine,VM),所述虚拟机部署在硬件设备上(例如,物理服务器)。虚拟机指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。本领域技术人员通过阅读本申请即可在通用物理服务器上虚拟出具有上述功能的多个通信设备。此处不再赘述。
相应的,在本申请另一实施例中,还公开一种终端装置,所述终端装置包括:
处理器和存储器,
所述存储器,用于存储程序指令;
所述处理器,用于调用并执行所述存储器中存储的程序指令,以使所述通信装置执行图4对应的实施例中的全部或部分步骤。
进一步的,该终端装置还可以包括:收发器和总线,所述存储器包括随机存取存储器和只读存储器。
其中,处理器通过总线分别耦接收发器、随机存取存储器以及只读存储器。其中,当需要运行该终端装置时,通过固化在只读存储器中的基本输入输出系统或者嵌入式系统中的bootloader引导系统进行启动,引导该终端装置进入正常运行状态。在该终端装置进入正常运行状态后,在随机存取存储器中运行应用程序和操作系统,从而使所述终端装置执行图4对应的实施例中的全部或部分步骤。
本发明实施例的终端装置可对应于上述图4所对应的实施例中的终端装置,并且,该终端装置中的处理器可以实现图4所对应的实施例中的终端装置所具有的功能和/或所实施的各种步骤和方法,为了简洁,在此不再赘述。
本申请实施例中的处理器可通过多种方式实现。示例性的,所述处理器可为处理单元,或者,也可为其他具有处理功能的模块。
需要说明的是,本实施例也可以基于通用的物理服务器结合网络功能虚拟化(英文:Network Function Virtualization,NFV)技术实现的终端装置,所述终端装置为虚拟终端装置(如,虚拟主机、虚拟路由器或虚拟交换机)。所述虚拟终端装置可以是运行有用于查询函数指针的程序的虚拟机(英文:Virtual Machine,VM),所述虚拟机部署在硬件设备上(例如,物理服务器)。虚拟机指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。本领域技术人员通过阅读本申请即可在通用物理服务器上虚拟出具有上述功能的多个通信设备。此处不再赘述。
具体实现中,本申请实施例还提供一种计算机可读存储介质,其中,所述计算机可读存储介质中存储有指令,当其在计算机上运行时,可使所述计算机实施包括图1和图3对应的实施例中的全部或部分步骤。该计算机可读存储介质设置在任意设备中,所述任意设备可为随机存取存储器(random-access memory,RAM),该存储器也可以包括非易失性存储器(non-volatile memory),例如只读存储器(read-only memory,ROM),快闪存储器(flashmemory),硬盘(hard disk drive,HDD)或固态硬盘(solid-state drive,SSD);存储器还可以包括上述种类的存储器的组合等。
具体实现中,本申请实施例还提供一种计算机可读存储介质,其中,所述计算机可读存储介质中存储有指令,当其在计算机上运行时,可使所述计算机实施包括图4对应的实施例中的全部或部分步骤。该计算机可读存储介质设置在任意设备中,所述任意设备可为随机存取存储器(random-access memory,RAM),该存储器也可以包括非易失性存储器(non-volatile memory),例如只读存储器(read-only memory,ROM),快闪存储器(flashmemory),硬盘(hard disk drive,HDD)或固态硬盘(solid-state drive,SSD);存储器还可以包括上述种类的存储器的组合等。
本领域技术任何还可以了解到本申请实施例列出的各种说明性逻辑块(illustrative logical block)和步骤(step)可以通过电子硬件、电脑软件,或两者的结合进行实现。这样的功能是通过硬件还是软件来实现取决于特定的应用和整个系统的设计要求。本领域技术人员可以对于每种特定的应用,可以使用各种方法实现所述的功能,但这种实现不应被理解为超出本申请实施例保护的范围。
本申请实施例中所描述的各种说明性的逻辑单元和电路可以通过通用处理器,数字信号处理器,专用集成电路(ASIC),现场可编程门阵列(FPGA)或其它可编程逻辑装置,离散门或晶体管逻辑,离散硬件部件,或上述任何组合的设计来实现或操作所描述的功能。通用处理器可以为微处理器,可选地,该通用处理器也可以为任何传统的处理器、控制器、微控制器或状态机。处理器也可以通过计算装置的组合来实现,例如数字信号处理器和微处理器,多个微处理器,一个或多个微处理器联合一个数字信号处理器核,或任何其它类似的配置来实现。
本申请实施例中所描述的方法或算法的步骤可以直接嵌入硬件、处理器执行的软件单元、或者这两者的结合。软件单元可以存储于RAM存储器、闪存、ROM存储器、EPROM存储器、EEPROM存储器、寄存器、硬盘、可移动磁盘、CD-ROM或本领域中其它任意形式的存储媒介中。示例性地,存储媒介可以与处理器连接,以使得处理器可以从存储媒介中读取信息,并可以向存储媒介存写信息。可选地,存储媒介还可以集成到处理器中。处理器和存储媒介可以设置于ASIC中,ASIC可以设置于UE中。可选地,处理器和存储媒介也可以设置于UE中的不同的部件中。
应理解,在本申请的各种实施例中,各过程的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本申请实施例的实施过程构成任何限定。
在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机程序指令时,全部或部分地产生按照本申请实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(DSL))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,DVD)、或者半导体介质(例如固态硬盘Solid State Disk(SSD))等。
本说明书的各个部分均采用递进的方式进行描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点介绍的都是与其他实施例不同之处。尤其,对于装置和系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例部分的说明即可。
尽管已描述了本申请的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请范围的所有变更和修改。
本领域的技术人员可以清楚地了解到本发明实施例中的技术可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本发明实施例中的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例或者实施例的某些部分所述的方法。
本说明书中各个实施例之间相同相似的部分互相参见即可。尤其,对于……实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例中的说明即可。
以上所述的本发明实施方式并不构成对本发明保护范围的限定。
Claims (20)
1.一种接口方法表生成方法,其特征在于,包括:
基于目标Java类可实现的各个接口函数的数量,生成所述目标Java类的哈希表,所述哈希表的大小为所述接口函数的数量与预设系数的乘积;
确定所述目标Java类的哈希算法;
基于所述目标Java类的哈希算法和所述各个接口函数的函数签名,确定所述各个接口函数的哈希值;
基于第一接口函数的哈希值和所述哈希表的大小,确定所述第一接口函数的函数指针在所述哈希表中的索引,并将所述第一接口函数的函数指针存储至所述索引指示的位置,所述第一接口函数为与其他接口函数不存在哈希冲突的接口函数;
将第二接口函数的函数签名和函数指针存储至冲突消除表,所述第二接口函数为与其他接口函数存在哈希冲突的接口函数。
2.根据权利要求1所述的方法,其特征在于,还包括:
将所述哈希表的大小存储至所述目标Java类的元数据信息中。
3.根据权利要求1所述的方法,其特征在于,所述基于第一接口函数的哈希值和所述哈希表的大小,确定所述第一接口函数的函数指针在所述哈希表中的索引,包括:
对所述第一接口函数的哈希值与所述哈希表的大小进行取余操作;
确定通过取余操作获取的余数为所述第一接口函数的函数指针在所述哈希表中的索引。
4.根据权利要求1至3任一项所述的方法,其特征在于,所述确定所述目标Java类的哈希算法,包括:
分别通过各种哈希算法与所述各个接口函数的函数签名,计算所述各个接口函数的哈希值;
比较通过所述各种哈希算法得到的哈希值之间,所存在的哈希冲突的数量;
确定当哈希冲突的数量最小时,所应用的哈希算法为所述目标Java类的哈希算法。
5.根据权利要求4所述的方法,其特征在于,还包括:
将所述目标Java类的哈希算法的算法索引存储至所述目标Java类的元数据信息中。
6.一种函数指针查询方法,其特征在于,包括:
基于目标Java类的元数据信息,获取所述目标Java类的哈希表的大小;
基于所述目标Java类待实现的接口函数的函数签名,计算所述接口函数的哈希值;
基于所述哈希表的大小和所述接口函数的哈希值,确定所述接口函数的函数指针对应所述哈希表的索引;
当所述索引指示的位置存储有函数指针时,确定所述索引指示的位置存储的所述函数指针为所述接口函数的函数指针;
当所述索引指示的位置未存储函数指针时,基于所述接口函数的函数签名查询冲突消除表,通过查询结果确定所述接口函数的函数指针。
7.根据权利要求6所述的方法,其特征在于,所述基于所述目标Java类待实现的接口函数的函数签名,计算所述接口函数的哈希值,包括:
查询所述目标Java类的元数据信息中包括的算法索引;
基于所述算法索引对应的哈希算法和所述目标Java类待实现的接口函数的函数签名,计算所述接口函数的哈希值。
8.根据权利要求6或7所述的方法,其特征在于,其特征在于,所述基于所述哈希表的大小和所述接口函数的哈希值,确定所述接口函数的函数指针对应所述哈希表的索引,包括:
对所述接口函数的哈希值与所述哈希表的大小进行取余操作;
确定通过取余操作获取的余数为所述接口函数的函数指针对应所述哈希表的索引。
9.一种终端装置,其特征在于,包括:
处理器;
所述处理器用于,基于目标Java类可实现的各个接口函数的数量,生成所述目标Java类的哈希表,所述哈希表的大小为所述接口函数的数量与预设系数的乘积,确定所述目标Java类的哈希算法,基于所述目标Java类的哈希算法和所述各个接口函数的函数签名,确定所述各个接口函数的哈希值,基于第一接口函数的哈希值和所述哈希表的大小,确定所述第一接口函数的函数指针在所述哈希表中的索引,并将所述第一接口函数的函数指针存储至所述索引指示的位置,所述第一接口函数为与其他接口函数不存在哈希冲突的接口函数,将第二接口函数的函数签名和函数指针存储至冲突消除表,所述第二接口函数为与其他接口函数存在哈希冲突的接口函数。
10.根据权利要求9所述的终端装置,其特征在于,
所述处理器还用于,将所述哈希表的大小存储至所述目标Java类的元数据信息中。
11.根据权利要求9所述的终端装置,其特征在于,
所述处理器具体用于,对所述第一接口函数的哈希值与所述哈希表的大小进行取余操作,并确定通过取余操作获取的余数为所述第一接口函数的函数指针在所述哈希表中的索引。
12.根据权利要求10至11任一项所述的终端装置,其特征在于,
所述处理器具体用于,分别通过各种哈希算法与所述各个接口函数的函数签名,计算所述各个接口函数的哈希值,比较通过所述各种哈希算法得到的哈希值之间,所存在的哈希冲突的数量,确定当哈希冲突的数量最小时,所应用的哈希算法为所述目标Java类的哈希算法。
13.根据权利要求12所述的终端装置,其特征在于,
所述处理器还用于,将所述目标Java类的哈希算法的算法索引存储至所述目标Java类的元数据信息中。
14.一种终端装置,其特征在于,包括:
处理器;
所述处理器用于,基于目标Java类的元数据信息,获取所述目标Java类的哈希表的大小,基于所述目标Java类待实现的接口函数的函数签名,计算所述接口函数的哈希值,基于所述哈希表的大小和所述接口函数的哈希值,确定所述接口函数的函数指针对应所述哈希表的索引,当所述索引指示的位置存储有函数指针时,确定所述索引指示的位置存储的所述函数指针为所述接口函数的函数指针,当所述索引指示的位置未存储函数指针时,基于所述接口函数的函数签名查询冲突消除表,通过查询结果确定所述接口函数的函数指针。
15.根据权利要求14所述的终端装置,其特征在于,
所述处理器具体用于,查询所述目标Java类的元数据信息中包括的算法索引,基于所述算法索引对应的哈希算法和所述目标Java类待实现的接口函数的函数签名,计算所述接口函数的哈希值。
16.根据权利要求14或15所述的终端装置,其特征在于,
所述处理器具体用于,对所述接口函数的哈希值与所述哈希表的大小进行取余操作,确定通过取余操作获取的余数为所述接口函数的函数指针对应所述哈希表的索引。
17.一种终端装置,其特征在于,包括:
处理器和存储器,
所述存储器,用于存储程序指令;
所述处理器,用于调用并执行所述存储器中存储的程序指令,以使所述通信装置执行权利要求1-5任一项所述的接口方法表生成方法。
18.一种终端装置,其特征在于,包括:
处理器和存储器,
所述存储器,用于存储程序指令;
所述处理器,用于调用并执行所述存储器中存储的程序指令,以使所述通信装置执行权利要求6-8任一项所述的函数指针查询方法。
19.一种计算机可读存储介质,其特征在于,
所述计算机可读存储介质中存储有指令,当其在计算机上运行时,使得所述计算机执行如权利要求1-5任一项所述的接口方法表生成方法。
20.一种计算机可读存储介质,其特征在于,
所述计算机可读存储介质中存储有指令,当其在计算机上运行时,使得所述计算机执行如权利要求6-8任一项所述的函数指针查询方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910156548.8A CN111638925A (zh) | 2019-03-01 | 2019-03-01 | 一种接口方法表生成方法、函数指针查询方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910156548.8A CN111638925A (zh) | 2019-03-01 | 2019-03-01 | 一种接口方法表生成方法、函数指针查询方法及装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN111638925A true CN111638925A (zh) | 2020-09-08 |
Family
ID=72329063
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910156548.8A Pending CN111638925A (zh) | 2019-03-01 | 2019-03-01 | 一种接口方法表生成方法、函数指针查询方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111638925A (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112217632A (zh) * | 2020-10-12 | 2021-01-12 | 国网电子商务有限公司 | 一种基于智能合约和哈希链的身份认证方法及装置 |
CN112583797A (zh) * | 2020-11-30 | 2021-03-30 | 深圳力维智联技术有限公司 | 多协议数据处理方法、装置、设备及计算机可读存储介质 |
CN115576954A (zh) * | 2022-11-24 | 2023-01-06 | 恒生电子股份有限公司 | 哈希表的确定方法及装置 |
-
2019
- 2019-03-01 CN CN201910156548.8A patent/CN111638925A/zh active Pending
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112217632A (zh) * | 2020-10-12 | 2021-01-12 | 国网电子商务有限公司 | 一种基于智能合约和哈希链的身份认证方法及装置 |
CN112217632B (zh) * | 2020-10-12 | 2023-09-08 | 国网数字科技控股有限公司 | 一种基于智能合约和哈希链的身份认证方法及装置 |
CN112583797A (zh) * | 2020-11-30 | 2021-03-30 | 深圳力维智联技术有限公司 | 多协议数据处理方法、装置、设备及计算机可读存储介质 |
CN112583797B (zh) * | 2020-11-30 | 2022-07-19 | 深圳力维智联技术有限公司 | 多协议数据处理方法、装置、设备及计算机可读存储介质 |
CN115576954A (zh) * | 2022-11-24 | 2023-01-06 | 恒生电子股份有限公司 | 哈希表的确定方法及装置 |
CN115576954B (zh) * | 2022-11-24 | 2023-04-07 | 恒生电子股份有限公司 | 哈希表的确定方法及装置 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10795871B2 (en) | Key-value stores implemented using fragmented log-structured merge trees | |
CN107609098B (zh) | 搜索方法及装置 | |
RU2663358C2 (ru) | Устройство и способ кластерного хранения | |
US8001273B2 (en) | Parallel processing of input data to locate landmarks for chunks | |
JP5842768B2 (ja) | 重複除去装置、重複除去方法及び重複除去プログラム | |
CN111638925A (zh) | 一种接口方法表生成方法、函数指针查询方法及装置 | |
CN108027713A (zh) | 用于固态驱动器控制器的重复数据删除 | |
US10255325B2 (en) | Extreme value computation | |
CN109460406B (zh) | 一种数据处理方法及装置 | |
US9547451B2 (en) | Writable clone data structure | |
US9639549B2 (en) | Hybrid of proximity and identity similarity based deduplication in a data deduplication system | |
CN109947667B (zh) | 数据访问预测方法和装置 | |
CN114817232A (zh) | 访问数据的方法及装置 | |
JP2022522790A (ja) | ブロックチェーントランザクションを追跡するための方法およびデバイス | |
US10073657B2 (en) | Data processing apparatus, data processing method, and computer program product, and entry processing apparatus | |
CN111381905B (zh) | 一种程序处理方法、装置及设备 | |
US8407187B2 (en) | Validating files using a sliding window to access and correlate records in an arbitrarily large dataset | |
CN111104435B (zh) | 一种元数据组织方法、装置、设备及计算机可读存储介质 | |
CN114816838A (zh) | 用于提高数据恢复效率的方法、装置、介质及计算机设备 | |
CN110516122B (zh) | 嵌套型数据的合并方法、装置及电子设备 | |
CN111143232A (zh) | 用于存储元数据的方法、设备和计算机程序产品 | |
US12038875B2 (en) | Digest value calculating device, access device, digest value calculating method, access method, and program | |
CN110781194B (zh) | 应用程序的表数据处理方法、装置、电子设备及存储介质 | |
US11593010B2 (en) | Systems and methods for block-data clustering-based deduplication | |
CN113535710B (zh) | 一种搜索方法、装置、终端设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |