一种建立哈希映射的方法、装置、存储介质与流程

文档序号:17696099发布日期:2019-05-17 21:32阅读:235来源:国知局
一种建立哈希映射的方法、装置、存储介质与流程

本发明涉及数据存储领域,具体涉及一种建立哈希映射的方法、装置、存储介质。



背景技术:

在程序设计过程中经常会把同类型的不同对象的数据放在连续的存储空间中,每个对象占用相同长度的空间,因此就可以用对象的偏移量非常高效的读取或编辑数据,这就是编程语言数组的实现方式。比如,一个应用系统有许多用户,每个用户有账号、姓名、密码等信息,把所有用户信息对象构建成一个数组,第k个用户,就直接用数组下标k快速的访问到该用户数据。

可是我们很多时候不仅需要用下标去访问用户数据,也需要通过账号,姓名或其他信息快速访问到用户数据。这时候常用的做法就是将每类信息用hash表、查找树或者跳跃表等数据结构做一个映射关系。要通过账号访问用户数据,就提前把账号当key,下标当value,创建所有key,value键值对的映射表。通过姓名或者其他信息访问用户数据,同样分别创建各类数据维度的映射表。

但是,在建立映射表时,无论用hash表、查找树还是其它方式实现,key都被冗余存储了,浪费了比较大的存储空间。因此,建立一种更加简洁的占用存储空间较少的映射关系是非常重要的。



技术实现要素:

针对上述提到的建立映射表时,容易占用多余的存储空间,冗余存储等问题,本发明提供了一种改进的建立哈希映射表的方法、装置、存储介质以解决上述存在的问题。

根据本发明的一方面,提供出一种建立哈希映射表的方法,包括:

s1:在数据库中构建第一向量用以顺序存储元素;

s2:构建哈希表,哈希表包括n个(n=1,2,…,i,…,n)哈希桶,第i个哈希桶包括2i+2个链表单元以及free指针,链表单元包括链表数据和下一个链表单元的地址,free指针用以存储后续链表的存储位置;

s3:通过哈希算法计算第一向量中的元素的哈希值,通过哈希值对2i+2取余得到表示哈希桶的位置的位置数据,并将相对应的第一向量中的元素所在的位置作为链表数据存储到位置数据表示的哈希桶的位置中,由此建立用于第一向量的哈希映射表。

在此哈希映射表中,仅在第一向量中存储一次数据元素,在哈希表中仅存储元素所对应的存储位置。

进一步地,后续链表初始化时包括2i+2个链表单元,产生哈希冲突时从后续链表中取一个链表单元用以存储链表数据。因此便于在产生哈希冲突时从free指针动态调取链表单元进行存储,有效解决哈希冲突问题。

进一步地,在数据库中构建第二向量,第二向量用以顺序存储第一向量中被删除元素所在的位置。第二向量存储的数据以便于第一向量中被删除元素存储位置的复用,有利于节约第一向量中的存储空间。

更进一步地,哈希算法包括md4、md5和sha-1中的一种。在此哈希映射表中使用的哈希算法不受限制,适用性广。

在进一步的实施例中,还提出了一种利用上述任一所述的方法建立的哈希映射表进行查询元素的方法,包括以下步骤:

p1:通过待查询元素的查找值计算哈希值,遍历哈希表中所有哈希桶;

p2:在大小为2i+2的哈希桶中,哈希值对2i+2取余为m,得到哈希桶中第m个位置的链表数据;

p3:判断链表数据是否为空,若链表数据不为空,获取第一向量中位置为链表数据的元素,取其字段值,判断字段值与查找值是否一致,一致则查找结束返回元素,不一致继续遍历哈希桶,直到哈希桶为空;

p4:对所有哈希桶重复步骤p2-p3,直到找到元素或全部遍历完成所有哈希桶。

在进一步的实施例中,还提出了一种利用上述任一所述的方法建立的哈希映射表进行存储元素的方法,包括以下步骤:

m1:通过待增加元素查找哈希表中的链表数据,判断链表数据是否为空,若链表数据不为空,则结束增加,若链表数据为空,继续下一步骤;

m2:判断第二向量是否为空,若第二向量为空,元素增加在第一向量的元素的后面,若第二向量不为空,链表数据取第二向量中的值,记为local,待增加元素增加在第一向量中local所对应的位置;

m3:从后往前遍历哈希表中的所有哈希桶,是否找到其中一个有空闲位置的哈希桶,若找到,则将待增加元素所计算的哈希值对2i+2取余为m,若未找到,增加一个哈希桶,将待增加元素所计算的哈希值对2k+2取余为h,k为哈希桶个数;

m4:找到哈希桶中第m或h个位置的链表数据,判断第m或h个位置的链表数据是否为空,若为空,则将local作为链表数据存入哈希桶的第m或h个位置,若不为空,则从后续链表中获取一个链表单元,将local作为链表单元的链表数据存储在哈希桶的第m或h个位置上。

在进一步的实施例中,还提出了一种利用上述任一所述的方法建立的哈希映射表进行删除元素的方法,包括以下步骤:

n1:通过待删除元素计算哈希值,遍历哈希表中所有哈希桶;

n2:在大小为2i+2的哈希桶中,哈希值对2i+2取余为m,得到哈希桶的第m个位置的链表数据;

n3:判断链表数据是否为空,若链表数据不为空,获取第一向量中位置为链表数据的元素,判断元素与待删除元素是否一致,不一致继续遍历链表,直到哈希桶为空;

n4:元素与待删除元素一致,则判断当前链表单元是否是链表头,若是链表头,则令当前链表单元的链表数据赋值为后一个链表单元的链表数据并将后一个链表单元插入到后续链表中进行回收,若不是链表头,则将后一个链表与前一个链表连接起来并将当前链表单元插入到后续链表中进行回收;

n5:将待删除元素删除,并将待删除元素的在第一向量的位置记在第二向量中。

在进一步的实施例中,还提出了一种建立哈希映射表的装置,包括存储器、处理器以及存储在存储器中并可在处理器上运行的计算机程序,处理器执行所述计算机程序时实现上述任一项所述方法的步骤。

在进一步的实施例中,还提出了一种计算机可读存储介质,计算机可读存储介质存储有计算机程序,计算机程序被处理器执行时实现上述任一项所述方法的步骤。

本发明提出了一种建立哈希映射表的方法和装置,通过在数据库中建立第一向量来储存需要映射的数据元素,全部只需要存储一份,没有冗余。再建立改进的哈希映射表,在此映射表中不需要存储键值对中的key,只要将把向量的位置数据当做键值对中的value进行存储,因此可以节省一大部分的存储空间。另外哈希映射表得到进一步的优化,使用动态扩展哈希桶、哈希桶链表头存储值,从而进一步提高空间使用率。因此在实现元素的查询、删除、增加过程中,不需要有冗余存储,有利于提高存储空间的利用率,实现数据库中数据的高效存储。

附图说明

为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简要介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本发明的实施例的建立哈希映射表的方法的流程示意图;

图2为本发明的实施例的建立的哈希映射表的示意图;

图3为本发明的实施例的建立的哈希映射表进行查询元素的流程示意图;

图4为本发明的实施例的建立的哈希映射表进行增加元素的流程示意图;

图5为本发明的实施例的建立的哈希映射表进行删除元素的流程示意图。

具体实施方式

为了使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明作进一步地详细描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。

图1是本发明一个实施例的建立哈希映射表的方法流程示意图,如图1所示,本发明公开了一种建立哈希映射表的方法,包括:

s1:在数据库中构建第一向量用以顺序存储元素;

s2:构建哈希表,哈希表包括n个(n=1,2,…,i,…,n)哈希桶,第i个哈希桶包括2i+2个链表单元以及free指针,链表单元包括链表数据和下一个链表单元的地址,free指针用以存储后续链表的存储位置;后续链表初始化时包括2i+2个链表单元,产生哈希冲突时从后续链表中取一个链表单元用以存储链表数据。

在优选的实施例中,哈希表采用链表地址链接法用以解决哈希冲突。因此便于在产生哈希冲突时从free指针动态调取链表单元进行存储,有效解决哈希冲突问题。也可以根据合适的应用场景采用其他合适的方法解决哈希冲突。

s3:通过哈希算法计算第一向量中的元素的哈希值,通过哈希值对2i+2取余得到表示哈希桶的位置的位置数据,并将相对应的第一向量中的元素所在的位置作为链表数据存储到位置数据表示的哈希桶的位置中,由此建立用于第一向量的哈希映射表。随着哈希映射表大小动态增加扩容,初始化为空。插入第一条数据时,创建第一个哈希桶,先将数据存储在第一个哈希桶内。哈希桶最少存储2i+2+1个链表数据,最多存储2i+3个链表数据。直到哈希桶内所有的链表单元都存储满链表数据后再增加一个哈希桶,依次类推,持续动态扩容,因此可以有效减少不必要的冗余占据存储空间。

并且在数据库中构建第二向量,第二向量用以顺序存储第一向量中被删除元素所在的位置。元素可以表示为姓名、账号、数据等组成的一种或多种的数据元素。第二向量存储的数据以便于第一向量中被删除元素存储位置的复用,有利于节约第一向量中的存储空间。在增加新的元素时,可以优选考虑将元素存放在第一向量中已被删除的位置,而不是直接扩容增加在第一向量的最后,因此可以有效减少不必要的位置存储占据空间。在优选的实施例中,哈希算法包括md4、md5和sha-1中的一种。在此哈希映射表中使用的哈希算法不受限制,适用性广,也可以采用其他合适的哈希算法进行哈希值的计算。图2是本发明的一个实施例的建立的哈希映射表的示意图,value是链表数据,next是下一个链表单元的地址。

在一个实施例中,本发明还提出了一种利用上述任一所述的方法建立的哈希映射表进行查询元素的方法,如图3所示,包括以下步骤:

p1:通过待查询元素的查找值计算哈希值,遍历哈希表中所有哈希桶;

p2:在大小为2i+2的哈希桶中,哈希值对2i+2取余为m,得到哈希桶中第m个位置的链表数据;

p3:判断链表数据是否为空,若链表数据不为空,获取第一向量中位置为链表数据的元素,取其字段值,判断字段值与查找值是否一致,一致则查找结束返回元素,不一致继续遍历哈希桶,直到哈希桶为空;

p4:对所有哈希桶重复步骤p2-p3,直到找到元素或全部遍历完成所有哈希桶。

待查询元素可包括账号、数据等,查找值可以为账号或key,因此通过建立的哈希映射表可以快速有效通过待查询元素的key查找到相对应的键值映射值value,即链表数据,再通过链表数据与第一向量中元素的位置关系,从而查询到所要查询的元素的位置及其所存储的数据元素。

例如,一个应用系统有10000000个用户信息,用户信息包含账号、密码、登录状态等。这些用户信息都保存在第一向量中,将用户的账号当做哈希算法的值计算,从而将第一向量中存储位置当做链表数据存储在哈希表中合适位置。当一个用户通过账号密码来登录系统时,则通过账号作为查找值,找到哈希表对应的链表数据,从而获取到第一向量中存储该账号用户的密码,验证是否是合法用户。

在另一个实施例中,本发明还提出了一种利用上述任一所述的方法建立的哈希映射表进行增加元素的方法,如图4所示,包括以下步骤:

m1:通过待增加元素查找哈希表中的链表数据,判断链表数据是否为空,若链表数据不为空,则结束增加,若链表数据为空,继续下一步骤;

m2:判断第二向量是否为空,若第二向量为空,元素增加在第一向量的元素的后面,若第二向量不为空,链表数据取第二向量中的值,记为local,待增加元素增加在第一向量中local所对应的位置;

m3:从后往前遍历哈希表中的所有哈希桶,是否找到其中一个有空闲位置的哈希桶,若找到,则将待增加元素所计算的哈希值对2i+2取余为m,若未找到,增加一个哈希桶,将待增加元素所计算的哈希值对2k+2取余为h,k为哈希桶个数;

m4:找到哈希桶中第m或h个位置的链表数据,判断第m或h个位置的链表数据是否为空,若为空,则将local作为链表数据存入哈希桶的第m或h个位置,若不为空,则从后续链表中获取一个链表单元,将local作为链表单元的链表数据存储在哈希桶的第m或h个位置上。

首先还是通过查询的方法查询第一向量中是否已存在与待增加元素一样的元素,进行判重,避免重复存储。最后再将待增加元素插入第一向量中合适的位置,并相应的在哈希表中寻找合适的哈希桶和链表单元存储链表数据。采用此哈希映射表可以快速有效的实现元素的增加,而避免造成不必要的冗余存储存在。

例如,系统需要增加来一个用户,首先通过账号查询哈希表,如果有找到链表数据,说明用户已经存在,创建失败;如果未找到,将用户信息存在第一向量中,并用账号作为哈希算法的值,找到哈希桶合适位置,将第一向量存储新增用户的位置当做链表数据存储在哈希表中。特别地,随着用户数据量的增多,哈希表中的哈希桶也会动态增加。

在另一个实施例中,本发明还提出了一种利用上述任一所述的方法建立的哈希映射表进行删除元素的方法,如图5所示,包括以下步骤:

n1:通过待删除元素计算哈希值,遍历哈希表中所有哈希桶;

n2:在大小为2i+2的哈希桶中,哈希值对2i+2取余为m,得到哈希桶的第m个位置的链表数据;

n3:判断链表数据是否为空,若链表数据不为空,获取第一向量中位置为链表数据的元素,判断元素与待删除元素是否一致,不一致继续遍历链表,直到哈希桶为空;

n4:元素与待删除元素一致,则判断当前链表单元是否是链表头,若是链表头,则令当前链表单元的链表数据赋值为后一个链表单元的链表数据并将后一个链表单元插入到后续链表中进行回收,若不是链表头,则将后一个链表与前一个链表连接起来并将当前链表单元插入到后续链表中进行回收;

n5:将待删除元素删除,并将待删除元素的在第一向量的位置记在第二向量中。

本方法先通过哈希映射关系查找到待删除元素所对应的哈希表中的链表数据,对此链表数据进行删除,并对哈希桶的链表单元进行相应的处理,使其保持完整的链表结构,最后将第一向量中相应位置的数据进行删除并将该位置存储在第二向量中。

在进一步的实施例中,还提出了一种建立哈希映射表的装置,包括存储器、处理器以及存储在存储器中并可在处理器上运行的计算机程序,处理器执行计算机程序时实现上述任一项所述方法的步骤。

在进一步的实施例中,还提出了一种计算机可读存储介质,计算机可读存储介质存储有计算机程序,计算机程序被处理器执行时实现上述任一项所述方法的步骤。

另外,本申请的每一个实施例可以通过由数据处理设备如计算机执行的数据处理程序来实现。显然,数据处理程序构成了本发明。此外,通常存储在一个存储介质中的数据处理程序通过直接将程序读取出存储介质或者通过将程序安装或复制到数据处理设备的存储设备(如硬盘和/或内存)中执行。因此,这样的存储介质也构成了本发明。存储介质可以使用任何类型的记录方式,例如纸张存储介质(如纸带等)、磁存储介质(如软盘、硬盘、闪存等)、光存储介质(如cd-rom等)、磁光存储介质(如mo等)等。

因此本申请还公开了一种非易失性存储介质,其中存储有数据处理程序,该数据处理程序用于执行本申请上述方法的任何一种实例。

另外,本申请所述的方法步骤除了可以用数据处理程序来实现,还可以由硬件来实现,例如,可以由逻辑门、开关、专用集成电路(asic)、可编程逻辑控制器和嵌微控制器等来实现。因此这种可以实现本申请所述方法的硬件也可以构成本申请。

本发明提出了一种建立哈希映射表的方法和装置,通过在数据库中建立第一向量来储存需要映射的数据元素,全部只需要存储一份,没有冗余。再建立改进的哈希映射表,在此映射表中不需要存储键值对中的key,只要将把向量的位置数据当做键值对中的value进行存储,因此可以节省一大部分的存储空间。另外哈希映射表得到进一步的优化,使用动态扩展哈希桶、哈希桶链表头存储值,从而进一步提高空间使用率。因此在实现元素的查询、删除、增加过程中,不需要有冗余存储,有利于提高存储空间的利用率,实现数据库中数据的高效存储。建立哈希映射表可以快速有效对数据进行存储。

显然,本领域技术人员在不偏离本发明的精神和范围的情况下可以做出对本发明的实施例的各种修改和改变。以该方式,如果这些修改和改变处于本发明的权利要求及其等同形式的范围内,则本发明还旨在涵盖这些修改和改变。词语“包括”不排除未在权利要求中列出的其它元件或步骤的存在。某些措施记载在相互不同的从属权利要求中的简单事实不表明这些措施的组合不能被用于获利。权利要求中的任何附图标记不应当被认为限制范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1