数据存储方法、数据查询方法及装置
技术领域
本发明涉及计算机技术领域,具体而言,涉及一种数据存储方法、数据查询方法及装置。
背景技术
在机器内存不断增加的情况下,通常以空间换时间的方法进行数据存储与查找,其中,哈希表(Hash table)因为数据查找时间复杂度为O(1),所以在使用上非常普遍。
现有技术的哈希表的实现中,以SGI STL中哈希表的实现为典型。但是,现有技术的哈希表中,其数据存储形式为数组与链表的结合,其数据存储是离散的,不便于快速加载和快速迁移。
发明内容
有鉴于此,本发明实施例提供了一种数据存储方法、数据查询方法及装置,以改善上述问题。
为了实现上述目的,本发明采用的技术方案如下:
一种数据存储方法,所述方法包括:接收多个存储数据,其中,每个存储数据对应一个哈希值;将所述多个存储数据分别存储于第一存储区域中连续的多个不同的第一存储单元中;根据所述多个存储数据分别对应的第一存储单元在所述第一存储区域中的位置,将所述多个存储数据分别对应的多个位置数据分别存储于第二存储区域的第二存储单元中,其中,第二存储区域包括多个连续的第二存储单元,每个第二存储单元对应一个哈希值,每个位置数据所存储的第二存储单元对应的哈希值,与该位置数据对应的存储数据对应的哈希值相等;根据所述存储数据在第一存储区域中的存储、所述位置数据在第二存储区域中的存储,在第三存储区域中存储第一存储区域以及第二存储区域的空间信息。
一种数据查询方法,应用于根据上述方法存储数据的数据存储设备中的数据查询,所述方法包括:根据接收到的查询值计算哈希值;根据计算获得的哈希值确定第二存储区域中的第二存储单元;根据确定的第二存储单元中存储的存储数据的位置数据,确定第一存储区域中的第一存储单元;获取确定的第一存储单元中的存储数据。
一种数据存储装置,所述装置包括:数据接收模块,用于接收多个存储数据,其中,每个存储数据对应一个哈希值;第一存储模块,用于将所述多个存储数据分别存储于第一存储区域中连续的多个不同的第一存储单元中;第二存储模块,用于根据所述多个存储数据分别对应的第一存储单元在所述第一存储区域中的位置,将所述多个存储数据分别对应的多个位置数据分别存储于第二存储区域的第二存储单元中,其中,第二存储区域包括多个连续的第二存储单元,每个第二存储单元对应一个哈希值,每个位置数据所存储的第二存储单元对应的哈希值,与该位置数据对应的存储数据对应的哈希值相等;第三存储模块,用于根据所述存储数据在第一存储区域中的存储、所述位置数据在第二存储区域中的存储,在第三存储区域中存储第一存储区域以及第二存储区域的空间信息。
一种数据查询装置,应用于根据上述方法存储数据的数据存储设备中的数据查询,所述装置包括:计算模块,用于根据接收到的查询值计算哈希值;第二存储单元确定模块,用于根据计算获得的哈希值确定第二存储区域中的第二存储单元;第一存储单元确定模块,用于根据确定的第二存储单元中存储的存储数据的位置数据,确定第一存储区域中的第一存储单元;数据获取模块,用于获取确定的第一存储单元中的存储数据。
本发明实施例提供的数据存储方法、数据查询方法及装置中,将存储数据存储于第一存储区域的连续的存储单元中,并且根据存储数据的哈希值以及第二存储单元对应的哈希值,在第二存储区域中存储每个存储数据在第一存储区域中的位置,同时在第三存储区域中存储第一存储区域以及第二存储区域的空间信息以备后续查询。本方案中,存储数据在存储设备中连续的存储空间中进行存储,使存储数据可以快速加载和快速迁移。
为使本发明的上述目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附附图,作详细说明如下。
附图说明
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
图1示出了本发明较佳实施例提供的电子设备的方框示意图;
图2示出了本发明第一实施例提供的数据存储方法的流程图;
图3示出了本发明第一实施例提供的第一存储区域的一种存储结构图;
图4示出了本发明第一实施例提供的第一存储单元的一种存储结构图;
图5示出了本发明第一实施例提供的第二存储区域的一种存储结构图;
图6示出了本发明第一实施例提供的第三存储区域的一种存储结构图;
图7示出了本发明实施例提供的数据存储设备的存储结构图;
图8示出了本发明第二实施例提供的数据查询方法的一种流程图;
图9示出了本发明第二实施例提供的数据查询方法的部分步骤的流程图;
图10示出了本发明第二实施例提供的数据查询方法的另一种流程图;
图11示出了本发明第三实施例提供的数据存储方法的功能模块图;
图12示出了本发明第四实施例提供的数据查询方法的功能模块图。
具体实施方式
下面将结合本发明实施例中附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本发明实施例的组件可以以各种不同的配置来布置和设计。因此,以下对在附图中提供的本发明的实施例的详细描述并非旨在限制要求保护的本发明的范围,而是仅仅表示本发明的选定实施例。基于本发明的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。
应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。同时,在本发明的描述中,术语“第一”、“第二”等仅用于区分描述,而不能理解为指示或暗示相对重要性。
图1示出了一种可应用于本发明实施例中的电子设备100的结构框图。如图1所示,电子设备100包括存储器102、存储控制器104,一个或多个(图中仅示出一个)处理器106、外设接口108、射频模块110等。这些组件通过一条或多条通讯总线/信号线116相互通讯。
存储器102可用于存储软件程序以及模块,如本发明实施例中的数据存储方法、数据查询方法及装置对应的程序指令/模块,处理器106通过运行存储在存储器102内的软件程序以及模块,从而执行各种功能应用以及数据处理,如本发明实施例提供的数据存储方法、数据查询方法。另外,存储器还可以作为本实施例中的数据存储设备,用于存储本实施例中数据存储方法及装置存储的存储数据。
存储器102可包括高速随机存储器,还可包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。处理器106以及其他可能的组件对存储器102的访问可在存储控制器104的控制下进行。
外设接口108将各种输入/输入装置耦合至处理器106以及存储器102。在一些实施例中,外设接口108,处理器106以及存储控制器104可以在单个芯片中实现。在其他一些实例中,他们可以分别由独立的芯片实现。
射频模块110用于接收以及发送电磁波,实现电磁波与电信号的相互转换,从而与通讯网络或者其他设备进行通讯。
可以理解,图1所示的结构仅为示意,电子设备100还可包括比图1中所示更多或者更少的组件,或者具有与图1所示不同的配置。图1中所示的各组件可以采用硬件、软件或其组合实现。
于本发明实施例中,电子设备100可以是个人电脑(personal computer,PC)、平板电脑、智能手机、个人数字助理(personal digital assistant,PDA)、车载设备、穿戴设备、服务器等。
第一实施例
本实施例提供了一种数据存储方法,请参见图2,该方法包括:
步骤S110:接收多个存储数据,其中,每个存储数据对应一个哈希值。
该多个存储数据为需要进行存储的待存储数据。可以理解的,每个存储数据均可以对应一个哈希(hash)值,可以通过计算得到。
步骤S120:将所述多个存储数据分别存储于第一存储区域中连续的多个不同的第一存储单元中。
在第一存储区域中包括多个连续的第一存储单元,在接收到存储数据后,分别将存储数据存储到不同的第一存储单元中,即存储数据与第一存储单元一一对应。
进一步的,由于可能存在一个哈希值对应多个不同的存储数据,即多个存储数据对应相同的哈希值,存在哈希冲突。因此,在本实施例中,还可以在存储单元中存储哈希冲突标识数据,以表示每个存储数据是否与其他存储数据存在哈希冲突。
具体的,可以是,计算每个存储数据的哈希值;当存储数据对应的哈希值与该存储数据唯一对应,在存储该存储数据的第一存储单元中存储第一数据作为哈希冲突标识数据。也就是说,对于某一存储数据而言,在所有存储数据中,没有其他存储数据的哈希值与该存储数据的哈希值一致,则该存储数据对应的第一存储单元中存储第一数据作为哈希冲突标识数据,则当某第一存储单元中存储的哈希冲突标识数据为第一数据时,表明不存在与该第一存储单元中存储的存储数据哈希冲突的存储数据。该第一数据的值在本实施例中并不作为限定,具体的,可以是0。
当多个存储数据对应相同的哈希值,在存储该多个存储数据的第一存储单元中分别存储第二数据作为哈希冲突标识数据。也就是说,当多个存储数据之间存在哈希冲突,则在存储该多个存储数据的第一存储单元中均存储第二数据作为哈希冲突标识数据,则当某第一存储单元中的哈希冲突标识数据为第二数据时,表明存在与该第一存储单元中的存储数据哈希值相同,哈希冲突的存储数据。该第二数据的值在本实施例中并不作为限定,具体的,可以是1。
优选的,在本实施例中,将哈希值相同的存储数据分别存储于位置相邻的第一存储单元中,使哈希值相同的存储数据分别存储于位置连续的第一存储单元中。也就是说,若几个存储数据的哈希值相同,则将这几个存储数据分别存储在位置连续相邻的第一存储单元中。具体实现方式可以是,将所有存储数据按照哈希值进行排序,再按照所排顺序将存储数据一一添加到连续相邻的第一存储单元中,使哈希值相同的存储数据存储于位置连续的第一存储单元中。
另外,在本实施例中,还包括,在每个第一存储单元中存储该第一存储单元中存储数据对应的关键码值,即key值,以及该第一存储单元中存储数据与关键码值的字节(byte)长度。
也就是说,在每个第一存储单元中,存储关键码值,该关键码值为该第一存储单元中的存储数据对应的关键码值。具体的,当将存储数据存入第一存储区域中的第一存储单元时,可以将对应的关键码值与该存储数据以一定的存储方式一起存储。
并且,第一存储单元中,还通过长度数据记录该第一存储单元中所存储的存储数据字节长度以及关键码值字节长度,例如,某第一存储单元内,关键码值的字节长度为1个字节,存储数据的字节长度为128字节,则在该第一存储单元内,记录关键码值与存储数据的字节长度为129字节,长度数据的值为129。可以理解的,每个存储数据的关键码值均为唯一值,即存储数据与关键码值一一对应,不存在关键码值相同的存储数据。
进一步的,在每个第一存储单元中,哈希冲突标识数据、长度数据、关键码值以及存储数据的存储位置关系一致,具体的,可以依次为哈希冲突标识数据、长度数据、关键码值以及存储数据。并且,优选的,在第一存储单元中,为哈希冲突标识数据以及长度数据分配固定的存储空间,即每个第一存储单元中,哈希冲突标识数据对应的存储空间一致,长度数据对应的存储空间一致。
另外,在本实施例中,还可以在第一存储单元中另外存储关键码值的单独的字节长度,其存储位置可以是在长度数据与关键码值之间。
进一步的,每个数据对应存储空间均在满足该数据存储的情况下设置为最小。其中,哈希冲突标识数据可以用1位(bit)表示,即分别以1或0表示是否存在哈希冲突。长度数据的存储空间的具体大小可以由所有存储数据中最长的存储数据的字节长度,以及关键码值的字节长度确定。例如,哈希冲突标识数据用1位表示,关键码值与最长存储数据的字节长度小于128,通过7位数据可以记录关键码值与最长存储数据的字节长度,则哈希冲突标识数据以及长度数据对应的存储空间为8位,1字节;关键码值与最长存储数据的字节长度大于等于128,小于32768,则哈希冲突标识数据以及长度数据对应的存储空间为2字节;关键码值与最长存储数据的字节长度大于等于32768,小于4294967296/2,则哈希冲突标识数据以及长度数据对应的存储空间为4字节。若关键码值与最长存储数据的字节长度比4294967296/2大,则可以设置一个较大且合适的存储空间,如8字节,为哈希冲突标识数据以及长度数据对应的字节空间。
在本实施例中,第一存储区域中多个第一存储单元的连续设置如图3所示,其中,dataUnit表示第一存储单元,每个第一存储单元中数据的存储形式可以如图4所示,其中,Key表示关键码值,Value表示存储数据,conflictBit表示哈希冲突标识数据,dataLen表示关键码值Key与存储数据Value的字节长度,dataValueSize表示conflictBit与dataLen的字节长度,即哈希冲突标识数据与长度数据所占存储空间。
步骤S130:根据所述多个存储数据分别对应的第一存储单元在所述第一存储区域中的位置,将所述多个存储数据分别对应的多个位置数据分别存储于第二存储区域的第二存储单元中,其中,第二存储区域包括多个连续的第二存储单元,每个第二存储单元对应一个哈希值,每个位置数据所存储的第二存储单元对应的哈希值,与该位置数据对应的存储数据对应的哈希值相等。
在本实施例中,第二存储区域中包括多个连续的第二存储单元,连续的第二存储单元可以具有连续的哈希值。其中,第二存储区域中第二存储单元的个数的确定在本实施例中并不限定,可以由存储数据的个数确定,例如,第二存储单元的个数可以为大于或等于存储数据个数的最小的素数。如,存储数据的个数为100,100不为素数,大于100的最小的素数为101,则第二存储单元的个数为101。对应的,101个连续的第二存储单元分别对应的哈希值可以依次为1至101。当然,在本实施例中,第二存储单元的个数的确定方式并不作为限定,可以将每个第二存储单元作为一个哈希桶,根据一般的哈希桶的确定方式确定。
第二存储区域中每个第二存储单元分别对应不同的哈希值,在其中存储存储数据在第一存储区域中的位置,也就是说,第二存储区域中的每个位置数据表示一个在第一存储区域中的位置,由于每个存储数据存储于第一存储单元中,则第二存储单元中存储的位置数据可以为相应存储数据所在的第一单元的位置数据。并且,每个第二存储单元对应的哈希值,与其中位置数据对应的存储数据的哈希值一致。
进一步的,在本实施例中,所述位置数据为,相应的存储数据对应的第一存储单元在所述第一存储区域中的偏移量。也就是说,每个位置数据可以为一个偏移量,表示对应的第一存储单元在第一存储区域中的偏移,例如,第一存储区域中第一个第一存储单元的偏移可以为如图3中箭头所示位置。其中,第一存储区域中的偏移量可以设置为以1作为起始置,图3所示的第一存储区域中第一个第一存储单元对应的偏移量可以为1,第二个第一存储单元对应的偏移量为1加上第一个第一存储单元的长度。
进一步的,由于可能有不止一个存储数据具有相同的哈希值,且该不止一个存储数据存储于连续的第一存储单元中,则该哈希值对应的第二存储单元中,存储的可以是该不止一个存储数据对应的连续的第一存储单元中的第一个第一存储单元的位置数据。
另外,也有可能第二存储区域中某个第二存储单元对应的哈希值并未对应有存储数据,例如,某个第二存储单元对应的哈希值为2,但是所有存储数据中,并不存在一个哈希值为2的存储数据,则哈希值2并未对应有存储数据。当某个第二存储单元对应的哈希值在第一存储区域中未对应有存储数据,可以在该第二存储单元中存储表示无效位置的第三数据。其中,该第三数据可以是不对应任何有效位置数据的数据,例如,位置数据为偏移量,且在第一存储区域中,偏移量起始值设置为1,则可以以0作为第三数据,当第三数据是0时,表示在第一区域中不对应任何位置,为一个无效位置。
进一步的,在本实施例中,设置每个第二存储单元的存储空间,且使所有第二存储单元的存储空间大小一致。具体的,当以偏移量表示位置数据,由于第一存储区域中最后一个第一存储单元在第一存储区域的最后,其偏移量的值最大,则第二存储单元的存储空间的大小可以根据所述第一存储区域的长度确定,使所有位置数据均能在相应的第二存储单元中存储。
具体的,由于获得存储数据后可以确定所有存储数据的信息,因此可以获知第一存储区域的总长度,由该第一存储区域的总长度,则可确定第二存储单元的存储空间大小。优选的,使在满足所有位置数据均能在相应的第二存储单元中存储的情况下,第二存储单元所占存储空间尽量小。例如,以totalDataLen表示第一存储区域的字节长度,bucketUnitSize表示第二存储单元的存储空间大小,若totalDataLen<256,bucketUnitSize就设置为1字节;若totalDataLen>=256并且totalDataLen<65536,bucketUnitSize就设置为2字节;若totalDataLen>=65536并且totalDataLen<4294967296,bucketUnitSize就设置为4字节。若totalDataLen>=4294967296,此时可以根据经验将bucketUnitSize设置为一个较大的值,使其能存储一个较大的数据,如设置为8字节。
如图5所示,表示第二存储区域中多个连续的第二存储单元,其中,bucketUnit表示第二存储单元,bucketUnitSize表示第二存储单元的存储空间大小,即第二存储单元所占的字节数。
步骤S140:根据所述存储数据在第一存储区域中的存储、所述位置数据在第二存储区域中的存储,在第三存储区域中存储第一存储区域以及第二存储区域的空间信息。
在第三存储区域存储第一存储区域以及第二存储区域的空间信息,以根据该第三存储区域中存储的空间信息获知存储数据所使用的空间,获得数据存储情况。
具体的,在本实施例中,在所述第三存储区域中存储的空间信息包括以下至少一种:第一存储区域的第一存储单元中记录存储数据与关键码值的字节长度的字段所占字节数、第二存储区域中的第二存储单元所占字节数、第二存储区域中第二存储单元的数量以及所述第一存储区域的总长度。优选的,第三存储区域中存储上述四种空间信息。
其中,第一存储区域的第一存储单元中记录存储数据与关键码值的字节长度的字段所占字节数,即上述长度数据所占存储空间的字节数。
进一步的,在每个第一存储单元中存储哈希冲突标识数据,第三存储区域存储的空间信息中,所述记录存储数据与关键码值的字节长度的字段所占字节数,根据所述第一存储区域中最长的存储数据的字节长度、哈希冲突标识数据以及关键码值的字节长度确定。也就是说,第三存储区域存储的空间信息中,包括上述长度数据以及哈希冲突标识数据的存储空间,其所占字节数。
另外,第二存储区域中的第二存储单元所占字节数,即上述第二存储单元的存储空间的字节大小。
第二存储区域中第二存储单元的数量即上述第二存储区域中第二存储单元的个数。
如前所述,第一存储区域的总长度根据所有存储数据的信息可以确定,即根据所有存储数据可以确定存储数据数量、存储数据总长度、关键码值总长度、哈希冲突标识数据总长度、记录关键码值以及存储数据的长度的长度数据所占字节长度,从而确定第一存储区域的总长度。
如图6示出了第三存储区域的数据存储,其中,dataValueSize表示记录存储数据与关键码值的字节长度的字段所占字节数,等于图4中所示的dataValueSize,即图4中conflictBit与dataLen的长度,哈希冲突标识数据与长度数据所占存储空间。bucketUnitSize表示第二存储区域中的第二存储单元所占字节数,等于图5中的bucketUnitSize。bucketNum表示第二存储区域中第二存储单元的数量,dataSegLen表示第一存储区域的总长度,等于前述totalDataLen。
综上所述,在本实施例提供的数据存储方法中,将存储数据存储于第一存储区域的连续的第一存储单元中,并且在第二存储区域的连续的第二存储单元中存储每个存储数据在第一存储区域中的位置,同时在第三存储区域中存储位置数据以及存储数据相关的空间信息,第一存储区域、第二存储区域以及第三存储区域在数据存储设备中位置可以是如图7所示。本方案中,存储数据在数据存储设备中连续的存储空间中进行存储,使存储数据方便落地为文件,可以快速加载和快速迁移,并且,数据组织结构紧凑,节约存储空间。又由于哈希值相同的存储数据是连续存储的,方便检索哈希值相同的存储数据,识别第二存储单元对应有哈希值中但该哈希值未对应有存储数据的情况。
另外,使用本实施例提供的数据存储方法生成的数据文件中,第一存储区域可以与第二存储区域以及第三存储区域分离,也就是说第一存储区域中的数据可以与第二存储区域中的数据以及第三存储区域中的数据分离存储。
因此,查询数据时,内存中只需导入第三存储区域和第二存储区域的数据,获得位置数据后,再通过存储第一存储区域数据的文件系统获取数据。另外,在第一存储区域中的数据量非常大时,数据文件可以存入分布式文件系统等,因此可以处理数据量较大的哈希表。并且,在使用通过本实施例提供的方法生成的数据文件时,可以根据数据的大小和使用设备当前内存的大小,选择是否将整个数据文件导入内存,这样可以减少对内存大小的依赖。
在数据字典的使用情景下,本实施例提供的方法可以用于在一次生成字典后,落地生成字典文件。当其他应用需要使用该生成的字典时,只需拷贝该字典文件到工作目录,无需了解字典生成过程,简化了应用逻辑,且字典一次生成,可以多次使用。与此同时,可以统一字典管理,由专门的应用生成字典。
第二实施例
本实施例提供了一种数据查询方法,应用于根据第一实施例所提供的方法存储数据的数据存储设备中的数据查询,请参见图8,所述方法包括:
步骤S210A:根据接收到的查询值计算哈希值。
接收查询值,通常的,该查询值为一个关键码值,可以根据该查询值计算获得一个哈希值。如通过对关键码值计算一次md5sum获得一个值,再将该值对第二存储单元的个数取模后获得该关键码值对应的哈希值。
步骤S220A:根据计算获得的哈希值确定第二存储区域中的第二存储单元。
由于第二存储区域的每个第二存储单元对应一个哈希值,则可以根据计算获得的哈希值确定第二存储单元。
根据哈希值确定第二存储单元的方法在本实施例中并不作为限定。具体的,当多个连续的第二存储单元对应连续的哈希值,则根据计算的哈希值以及第二存储单元的所占字节数可以定位到相应的第二存储单元。其中,第二存储单元的字节数可以从第三存储区域中获取。
例如,第二存储区域中有101个第二存储单元,其对应的哈希值分别依次为1至101,当根据查询值计算获得的哈希值为50,则定位到第50个第二存储单元,则为哈希值等于50的第二存储单元。另外,可以理解的,若计算获得的哈希值大于第二存储单元的数量,则用该哈希值对该数量取模,对应的哈希值等于取模后获得的值的第二存储单元,为所要获取的第二存储单元。例如,若计算获得的哈希值为103,则对第二存储单元的个数101取模后,等于2,则对应的哈希值为2的第二存储单元为所要获取的第二存储单元。其中,第二存储单元的数量可以从第三存储区域存储的空间信息中获得。
步骤S230A:根据确定的第二存储单元中存储的存储数据的位置数据,确定第一存储区域中的第一存储单元。
当确定到第二存储单元后,则可以获取该第二存储单元中的位置数据,根据该位置数据,则可以获得一个第一存储单元。例如,当位置数据为偏移量时,可以根据该偏移量的偏移,定位到一个第一存储单元。
当然,当第二存储单元对应的哈希值并未对应有存储数据,则该第二存储单元中存储的位置数据为表示无效位置的数据,不能定位第一存储单元。因此,在本步骤之前,还可以包括:判断所述第二存储单元中存储的位置数据是否等于表示无效位置的第三数据,若否,执行步骤S230A。若第二存储单元中存储的位置数据是等于表示无效位置的第三数据,则未找到存储数据,本次数据查询结束。
步骤S240A:获取确定的第一存储单元中的存储数据。
当确定第一存储单元后,则可获取该第一存储单元中的存储数据。在获取过程中,根据第三存储区域中存储的第一存储单元中记录存储数据与关键码值的字节长度的字段所占字节数,可以从第一存储单元中获得哈希冲突标识数据以及存储数据与关键码值的字节长度,同时可以确定关键码值与存储数据在该第一存储单元中的起始位置,再根据存储数据以及关键码值的共同的字节长度,可以获得关键码值与存储数据。再根据关键码值与存储数据在第一存储单元中的存储方式,可以对应解析分别得到关键码值以及存储数据。
进一步的,在一种具体的实施方式中,可以由查询值的字节长度确定关键码值的字节长度,例如,关键码值为规则的数据,如数据类型为uint32等所占字节长度一定的数据,查询值所占字节长度与存储的关键码值的字节长度一致,以查询值的字节长度确定关键码值的字节长度,从而根据哈希冲突标识数据、长度数据、关键码值以及存储数据之间存储的位置关系,从记录的关键码值与存储数据中分别确定关键码值以及存储数据。
另外,在另一种具体的实施方式中,在第一存储单元中另外专门存储关键码值的单独的字节长度。在查询过程中,存储关键码值的单独的字节长度的存储空间的长度作为预设值,如关键码值所占的字节长度为4字节,则专门存储关键码值的单独的字节长度的存储空间中的值为4,该预设值等于存储4所需的字节长度。根据该预设值则可以从第一存储单元中获取到存储关键码值的单独的字节长度的存储空间,从而可以确定关键码值所占的字节长度,从而确定关键码值以及存储数据。
由于同一个哈希值可能对应多个存储数据,即通过第二存储单元中的位置数据定位到的第一存储单元中的存储数据可能并非所要查找的存储数据,因此,在本实施例中,如图9所示,该步骤S240A还可以包括:
步骤S241:判断确定的第一存储单元中的关键码值是否等于所述查询值,若确定的第一存储单元中的关键码值等于所述查询值,获取该第一存储单元中的存储数据,本次查询结束。
由于每个存储数据的关键码值是唯一的,不同存储数据的关键码值不同,因此,判断所确定的第一存储单元中的关键码值与查询值是否一致,若一致,则表明该第一存储单元中的存储数据为所要查询的存储数据,获得该存储数据,本次数据查询结束。
步骤S242:若确定的第一存储单元中的关键码值不等于所述查询值,判断该第一存储单元中的哈希冲突标识数据是否等于第一数据。
当所确定的第一存储单元中的关键码值与查询值不一致,则可以进一步判断是否该查询值对应的哈希值对应多个存储数据,而其他存储数据为要查询的数据,因此,可以进一步判断所确定的第一存储单元中哈希冲突标识数据是否等于表示不具有哈希冲突的第一数据。
步骤S243:若确定的第一存储单元中的哈希冲突标识数据等于第一数据,本次数据查询结束。
若确定的第一存储单元中的哈希冲突标识数据等于第一数据,表示该第一存储单元中的存储数据不与其他存储数据存在哈希冲突,根据查询值所计算获得的哈希值在该数据存储设备中不对应有存储数据,本次数据查询结束,未查询到数据。
步骤S244:若确定的第一存储单元中的哈希冲突标识数据不等于第一数据,判断下一个第一存储单元中的关键码值是否等于所述查询值,直到本次查询结束。
若确定的第一存储单元中的哈希冲突标识数据不等于第一数据,等于第二数据,则该第一存储单元的下一个第一存储单元中的存储数据所对应的哈希值可能等于,查询值计算获得的哈希值。因此,进一步对已下一个第一存储单元作为确定的用于查询存储数据的第一存储单元,循环执行步骤S241至步骤S244,直到查询结束。
也就是说,如图10所示,在该查询过程中,一种具体的查询过程可以为:
步骤S210B:接收查询值。
步骤S220B:根据接收的查询值计算哈希值。
步骤S230B:根据哈希值定位第二存储单元。
步骤S240B:第二存储单元中位置数据是否为第三数据,若是,执行步骤S280B;若否,执行步骤S250B。
步骤S250B:根据第二存储单元中的位置数据确定第一存储单元。
步骤S260B:判断第一存储单元中的关键码值与查询值是否一致,若是,执行步骤290B;若否,执行步骤S270B。
步骤S270B:第一存储单元中的哈希冲突标识数据是否等于第一数据,若是,执行步骤S280B;若否,定位到下一个第一存储单元,执行步骤S260B。
步骤S280B:未查找到数据,查询结束。
步骤S290B:获取第一存储单元中的存储数据,查询结束。
在本实施例提供的数据查询方法中,由于是基于哈希表的,根据哈希值定位所要查询的存储数据的位置,根据关键码值确定所要查询的存储数据,其时间复杂度为O(1)。
第三实施例
本实施例提供了一种数据存储装置300,请参见图11,所述装置300包括:
数据接收模块310,用于接收多个存储数据,其中,每个存储数据对应一个哈希值;第一存储模块320,用于将所述多个存储数据分别存储于第一存储区域中连续的多个不同的第一存储单元中;第二存储模块330,用于根据所述多个存储数据分别对应的第一存储单元在所述第一存储区域中的位置,将所述多个存储数据分别对应的多个位置数据分别存储于第二存储区域的第二存储单元中,其中,第二存储区域包括多个连续的第二存储单元,每个第二存储单元对应一个哈希值,每个位置数据所存储的第二存储单元对应的哈希值,与该位置数据对应的存储数据对应的哈希值相等;第三存储模块340,用于根据所述存储数据在第一存储区域中的存储、所述位置数据在第二存储区域中的存储,在第三存储区域中存储第一存储区域以及第二存储区域的空间信息。
进一步的,在本实施例中,还包括计算模块,用于计算每个存储数据的哈希值。当存储数据对应的哈希值与该存储数据唯一对应,第一存储模块320还用于在存储该存储数据的第一存储单元中存储第一数据作为哈希冲突标识数据,当多个存储数据对应相同的哈希值,第一存储模块320还用于在存储该多个存储数据的第一存储单元中分别存储第二数据作为哈希冲突标识数据。
进一步的,第一存储模块320用于将哈希值相同的存储数据存储于位置连续的第一存储单元中。
另外,在本实施例中,第一存储模块320还用于在每个第一存储单元中存储该第一存储单元中存储数据对应的关键码值,以及该第一存储单元中存储数据与关键码值的字节长度。
具体的,本实施例中,所述位置数据为,相应的存储数据对应的第一存储单元在所述第一存储区域中的偏移量。
另外,当所述第二存储单元对应的哈希值在第一存储区域中未对应有存储数据,第二存储模块330还用于在该第二存储单元中存储表示无效位置的第三数据。
本实施例提供的装置300中,第三存储模块340用于存储的空间信息包括以下至少一种:第一存储区域的第一存储单元中记录存储数据与关键码值的字节长度的字段所占字节数、第二存储区域中的第二存储单元所占字节数、第二存储区域中第二存储单元的数量以及所述第一存储区域的总长度。
其中,在一种具体的实施方式中,所述记录存储数据与关键码值的字节长度的字段所占字节数,可以根据所述第一存储区域中最长的存储数据的字节长度以及关键码值的字节长度确定。
在另一种具体的实施方式中,在每个第一存储单元中存储哈希冲突标识数据,所述记录存储数据与关键码值的字节长度的字段所占字节数,可以根据所述第一存储区域中最长的存储数据的字节长度、哈希冲突标识数据以及关键码值的字节长度确定。
另外,所述第二存储区域中第二存储单元所占字节数,可以根据所述第一存储区域的长度确定。
第四实施例
本实施例提供了一种数据查询装置400,应用于根据第一实施例提供的方法存储数据的数据存储设备中的数据查询,其中,如图12所示,所述装置400包括:计算模块410,用于根据接收到的查询值计算哈希值;第二存储单元确定模块420,用于根据计算获得的哈希值确定第二存储区域中的第二存储单元;第一存储单元确定模块430,用于根据确定的第二存储单元中存储的存储数据的位置数据,确定第一存储区域中的第一存储单元;数据获取模块440,用于获取确定的第一存储单元中的存储数据。
进一步的,在本实施例中,还包括第一判断模块450,用于判断所述第二存储单元中存储的位置数据是否等于表示无效位置的第三数据,若否,第一存储单元确定模块430根据确定的第二存储单元中存储的存储数据的位置数据,确定第一存储区域中的第一存储单元。
另外,本实施中还包括第二判断模块460,用于判断确定的第一存储单元中的关键码值是否等于所述查询值。若第二判断模块460的判断结果为确定的第一存储单元中的关键码值等于所述查询值,数据获取模块440获取该第一存储单元中的存储数据,本次查询结束。
若第二判断模块460的判断结果为确定的第一存储单元中的关键码值不等于所述查询值,进一步判断该第一存储单元中的哈希冲突标识数据是否等于第一数据;若确定的第一存储单元中的哈希冲突标识数据等于第一数据,本次数据查询结束;若确定的第一存储单元中的哈希冲突标识数据不等于第一数据,第二判断模块460用于判断下一个第一存储单元中的关键码值是否等于所述查询值,直到本次查询结束。
需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。对于装置类实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
在本申请所提供的几个实施例中,应该理解到,所揭露的装置和方法,也可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,附图中的流程图和框图显示了根据本发明的多个实施例的装置、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现方式中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
另外,在本发明各个实施例中的各功能模块可以集成在一起形成一个独立的部分,也可以是各个模块单独存在,也可以两个或两个以上模块集成形成一个独立的部分。
所述功能如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。