一种关键数据结构的动态重构方法技术

技术编号:35026104 阅读:25 留言:0更新日期:2022-09-24 22:57
本发明专利技术公开了一种关键数据结构的动态重构方法,此方法适用于多种数据结构,以哈希表为例,首先新建一个哈希表,用于存储旧的哈希表中的节点;遍历旧哈希表中每个哈希桶的节点,对于每个节点,首先全局指针指向该节点,此时该节点进入危险期然后将该节点从旧哈希表中删除;根据新的哈希表的哈希函数,确定当前节点在新哈希表中的位置,将当前节点插入到新哈希表中,同步将全局指针设为NULL,当前节点结束危险期状态;重复上述操作,直至旧哈希表中节点数为0,删除旧哈希表。本发明专利技术通过动态改变哈希函数来重建哈希表,解决健壮性问题,使用全局指针解决了在重建哈希表的过程中由于伴随着并发的插入、删除以及查询操作所导致的数据短暂丢失的问题。数据短暂丢失的问题。数据短暂丢失的问题。

【技术实现步骤摘要】
一种关键数据结构的动态重构方法


[0001]本专利技术属于数据处理
,具体而言涉及一种关键数据结构的动态重构方法。

技术介绍

[0002]现有计算机系统中,数据结构的关键参数不能动态调整。例如,哈希表中使用的哈希函数,B+树中每个节点可容纳元素的个数等参数。程序一旦开始运行,这些关键参数通常不能再调整。现有调整方法分为两类。(1)基于锁的动态调整方法。调整时,先对要调整的数据结构实例加锁,之后,将数据结构实例中的数据转移到新的数据结构实例中。相应地,新的数据结构实例也需要加锁。使用锁,不仅会导致死锁、活锁等问题,还会降低数据结构的性能,比如延迟增加或者导致操作暂停。(2)完全暂停服务的调整方法。具体地,在调整数据结构关键参数时,首先将正在执行的操作暂停。然后,对数据结构进行调整。最后,重启之前被暂停的操作。此方法也会导致不必要的延迟,使数据结构的性能下降。
[0003]以哈希表为例,大多数现有的哈希表缺乏健壮性。即使预定义的哈希函数不能将传入数据均匀地分配到哈希表桶,也无法更改哈希函数。这个健壮性问题影响了一系列操作系统和编程语言中的哈希表的实现,包括Linux内核、PHP以及.NET。研究人员提出了各种技术来解决这个健壮性问题。研究最多的解决方案是全域哈希(universal hashing),它通过从一组精心设计的散列函数中随机选择一个散列函数,理论上可以提供良好的性能并解决上述健壮性问题。不幸的是,经验评估表明全域哈希不适合诸如Perl之类的应用程序,Perl大量用于处理通常从受限字符集中选择的字符串,因此具有意想不到的分布特性。此外,新的研究表明,攻击者有可能观察或猜测预定义散列函数的随机选择,从而使全域哈希失去作用。
[0004]动态重构哈希表的关键在于如何把旧哈希表中的每个节点分发(转移)到新的哈希表中。为了分发每个节点,重建操作必须更新两个哈希表。对一个哈希表进行插入或者删除操作可以是原子的和非阻塞的,但是没有一个非阻塞的方法能够将一个节点从旧的哈希表转移到新的哈希表中,从而造成数据的短暂丢失。比如,线程1先(1)将节点A从旧哈希表删除,然后(2)将节点A插入到新哈希表。如果有一个线程2,在线程1执行完(1)之后,执行(2)之前执行查找节点A的操作,线程2将无法在旧哈希表和新哈希表中查找到节点A。只有当线程1把节点A插入到新的哈希表后,线程2才能够查找到节点A。这就会造成节点A的短暂丢失。
[0005]因此,现在急需一种关键数据结构的动态重构的方法对哈希表进行动态重构解决健壮性问题和数据短暂丢失的问题。

技术实现思路

[0006]本专利技术针对现有技术中的不足,提供一种关键数据结构的动态重构方法,通过动态改变哈希函数来重建哈希表,解决健壮性问题,使用全局指针解决了在重建哈希表的过
程中由于伴随着并发的插入、删除以及查询操作所导致的数据短暂丢失的问题。
[0007]为实现上述目的,本专利技术采用以下技术方案:
[0008]本专利技术实施例提出了一种关键数据结构的动态重构方法,所述重构方法包括以下步骤:
[0009]S1,新建一个哈希表,用于存储旧的哈希表中的节点;
[0010]S2,遍历旧哈希表中每个哈希桶的节点,对于每个哈希桶中的每个节点,全局指针指向该节点,该节点进入危险期,转入步骤S3;所述危险期是指分发节点过程中,指定节点已经从旧的哈希表中删除,但尚未存入新的哈希表的一段时间;
[0011]S3,将该节点从旧哈希表中删除;
[0012]S4,根据新的哈希表的哈希函数,确定当前节点在新哈希表中的位置,将当前节点插入到新哈希表中,同步将全局指针调整为NULL,该节点结束危险期状态;
[0013]S5,重复步骤S2

S4,直至旧哈希表中节点数为0,删除旧哈希表。
[0014]进一步地,所述重构方法应用于查找操作时,包括以下具体步骤:
[0015]S21,根据外部输入的节点的键值,确定待查找节点的键值为key;
[0016]S22,在旧哈希表中确定键值为key的节点所在的哈希桶,遍历该哈希桶,查找键值为key的节点,若查找到键值为key的节点,则返回该节点的指针,结束流程;若未查找到键值为key的节点,则转入步骤S23;
[0017]S23,判断当前是否有重建操作正在执行,如没有重建操作正在执行,则返回

ENOENT,表示哈希表中没有键值为key的节点,结束流程;若当前有重建操作正在执行,则转入步骤S24;
[0018]S24,遍历处于危险期的节点,查找键值为key的节点,若查找到键值为key的节点,返回该节点的指针,结束流程;若未查找到键值为key的节点,则转入步骤S25;
[0019]S25,在新哈希表中确定键值为key的节点所在的哈希桶,遍历该哈希桶,查找键值为key的节点,若查找到键值为key的节点,返回该节点的指针,结束流程;若未查找到键值为key的节点,则查找结束,返回

ENOENT,表示哈希表中没有键值为key的节点。
[0020]进一步地,所述重构方法应用于删除操作时,包括以下具体步骤:
[0021]S26,根据外部输入的节点的键值,确定待删除节点的键值key;
[0022]S27,在旧哈希表中确定键值为key的节点所在的哈希桶位置,尝试删除键值为key的节点;如删除成功,则返回SUCCESS,结束流程;如未删除成功,则转入步骤S28;
[0023]S28,判断是否有重建操作正在执行,如没有重建操作在执行,则删除结束,返回

ENOENT,表示哈希表中没有键值为key的节点,删除失败;如有重建操作在执行,则转入步骤S29;
[0024]S29,遍历处于危险期的节点,尝试删除键值为key的节点,如成功删除,则返回SUCCESS,流程结束;如未删除成功,则转入步骤S30;
[0025]S30,在新哈希表中确定键值为key的节点所在哈希桶的位置,尝试删除键值为key的节点,如删除成功,返回SUCCESS,流程结束;如未删除成功,则删除结束,返回

ENOENT,表示哈希表中没有键值为key的节点,删除失败。
[0026]进一步地,所述重构方法应用于插入操作时,包括以下步骤:
[0027]S31,根据外部输入的节点的键值,确定待插入节点的键值key;
[0028]S32,判断是否有重建操作正在执行,如没有重建操作正在执行,则转入步骤S33;如有重建操作正在执行,则转入步骤S34;
[0029]S33:在旧哈希表中确定键值为key的节点哈希桶的位置,插入键值为key的节点;如插入成功,则返回SUCCESS,流程结束;如插入失败,则转入步骤S36;
[0030]S34,在旧哈希表和处于危险期的节点中查找键值为key的节点;如找键值为key的节点,转入步骤S36;如未找键值为key的节点,则转入步骤S35;
...

【技术保护点】

【技术特征摘要】
1.一种关键数据结构的动态重构方法,其特征在于,所述重构方法包括以下步骤:S1,新建一个哈希表,用于存储旧的哈希表中的节点;S2,遍历旧哈希表中每个哈希桶的节点,对于每个哈希桶中的每个节点,全局指针指向该节点,该节点进入危险期,转入步骤S3;所述危险期是指分发节点过程中,指定节点已经从旧的哈希表中删除,但尚未存入新的哈希表的一段时间;S3,将该节点从旧哈希表中删除;S4,根据新的哈希表的哈希函数,确定当前节点在新哈希表中的位置,将当前节点插入到新哈希表中,同步将全局指针调整为NULL,该节点结束危险期状态;S5,重复步骤S2

S4,直至旧哈希表中节点数为0,删除旧哈希表。2.根据权利1所述的关键数据结构的动态重构方法,其特征在于,所述重构方法应用于查找操作时,包括以下具体步骤:S21,根据外部输入的节点的键值,确定待查找节点的键值为key;S22,在旧哈希表中确定键值为key的节点所在的哈希桶,遍历该哈希桶,查找键值为key的节点,若查找到键值为key的节点,则返回该节点的指针,结束流程;若未查找到键值为key的节点,则转入步骤S23;S23,判断当前是否有重建操作正在执行,如没有重建操作正在执行,则返回

ENOENT,表示哈希表中没有键值为key的节点,结束流程;若当前有重建操作正在执行,则转入步骤S24;S24,遍历处于危险期的节点,查找键值为key的节点,若查找到键值为key的节点,返回该节点的指针,结束流程;若未查找到键值为key的节点,则转入步骤S25;S25,在新哈希表中确定键值为key的节点所在的哈希桶,遍历该哈希桶,查找键值为key的节点,若查找到键值为key的节点,返回该节点的指针,结束流程;若未查找到键值为key的节点,则查找结束,返回

ENOENT,表示哈希表中没有键值为key的节点。3.根据权利1所述的关键数据结构的动态重构方法,其特征在于,所述重构方法应用于删除操作时,包括以下具体...

【专利技术属性】
技术研发人员:王俊昌刘敦伟肖甫樊卫北何昕田臣
申请(专利权)人:南京邮电大学
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1