为远程差异压缩标识对象的方法和系统转让专利

申请号 : CN200510108958.3

文献号 : CN1753368B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : A·瓦布勒D·提奥道修M·S·马纳塞

申请人 : 微软公司

摘要 :

本发明为远程差异压缩寻找候选对象。使用远程差异压缩(RDC)技术在两个或多个计算设备之间更新对象,从而将所需的数据传输最小化。一种算法提供改进的效率,允许接收者定位一组与需要从发送者转移来的对象相似的对象。一旦找到了这组相似的对象,接收者在RDC算法期间可以重复使用来自这些对象的任何字节块。

权利要求 :

1.一种为远程差异压缩标识对象的方法,其特征在于,包括:计算一个对象的特性,其中计算所述对象的特性还包括:将所述对象分成字节块;

为所述对象字节块的每一块计算签名;

将所述签名分组成为堆叠段;

为所述堆叠段的每一个计算至少一个堆叠段签名;

将所述堆叠段签名映射成映像组;

从所述映像组计算预特性;以及

用所述预特性计算所述特性,其中所述特性的大小小于所述预特性的大小;

用所述特性标识与所述对象相似的候选对象;以及从所标识的候选对象中选择最终对象。

2.如权利要求1所述的方法,其特征在于,计算所述对象的特性还包括:通过使用所述对象的每个字节位置周围的一个小窗中的字节的值,在所述对象的每个字节位置处生成指纹。

3.如权利要求1所述的方法,其特征在于,计算所述对象的特性还包括:通过使用所述对象的每个字节位置周围的一个小窗中的字节的值,在所述对象的每个字节位置处生成指纹,其中,将所述对象分成字节块包括基于所述指纹对所述对象进行分块。

4.如权利要求1所述的方法,其特征在于,进一步包括使用所述候选对象来重构所述对象,其中,所述使用所述候选对象包括:将来自所述候选对象中的k个最匹配的对象分成本地字节块;

为每个本地字节块计算本地签名;

将从一远程设备收到的远程签名与所述本地签名相比较;以及当所述签名比较指示可重复使用所述本地字节块时,重复使用本地字节块来重构所述远程对象。

5.如权利要求1所述的方法,其特征在于,还包括:通过紧凑编码所述特性,将特性存储在设备的易失存储器中;

创建紧凑地表示设备上的对象ID的对象映射关系,其中,每个紧凑表示用预定大小来表示;以及创建形成至少两级索引的特性表,所述索引从一个特性号和一个特性值映射到一个特性组。

6.如权利要求5所述的方法,其特征在于,还包括:寻找具有相似特性的对象,包括以下步骤:创建存储桶(OBx...OBt)以存储匹配远程对象OB的至少x个特性的本地对象;

选择对应于对象OB的t个特性的TraitSet(TS1...TSt);

将索引(P1...Pt)初始化为分别指向TS1...TSt的第一个元素,其中TSk[Pk]是Pk所指向的对象ID的表示法;

当确定P1……Pt的每一个都分别指向超过其TraitSet数组TS1……TSt的最后一个元素时,选择所需数量的相似对象,选择MinP组,其中所述MinP组是指向最小对象ID的索引组;

将MinID设成MinP中所有索引所指向的最小对象ID;

当确定k≥x并且ObjectMap(MinP)不是死的条目时,将MinID追加到OBk,其中k=|MinP|,它对应于匹配特性的个数;以及将MinP中的每个索引Pk向前移至其各自的TraitSet数组TSk中的下一个对象ID。

7.一种用于为远程差异压缩标识对象的系统,其特征在于,包括:用于将一个对象分成字节块的装置;

用于为所述对象字节块的每一块计算签名的装置;

用于将所述签名分组成为堆叠段的装置;

用于为所述堆叠段的每一个计算至少一个堆叠段签名的装置;

用于将所述堆叠段签名映射成映像组的装置;

用于从所述映像组计算预特性的装置,所述从所述映像组计算预特性的装置包括:用于应用一个确定性的数学函数的装置,所述函数从每个映像组中选择计算所得的散列值中的一个,其中所述确定性的数学函数是从最大值函数和最小值函数中选出的;

用于用所述预特性计算所述特性的装置,其中所述特性的大小小于所述预特性的大小,使用所述特性以标识与所述对象相似的最终对象,其中所述计算所述特性的装置包括用于应用一个确定性的数学函数到每个所述预特性以创建每一个都具有预定比特数的特性的装置,且所述特性的比特数少于所述预特性的比特数。

8.如权利要求7所述的系统,其特征在于,用于将所述对象分成字节块的装置包括:通过使用在所述对象的每个字节位置周围的一个小窗中的字节的值,在所述对象的每个字节位置处生成指纹,以及基于所述指纹对所述对象进行分块的装置。

9.如权利要求7所述的系统,其特征在于,用于将所述签名分组成为堆叠段的装置包括串接签名以形成一个堆叠段。

10.如权利要求7所述的系统,其特征在于,还包括:用于创建紧凑地表示设备上的对象ID的对象映射关系,其中每个紧凑表示用预定大小来表示的装置;以及用于创建形成至少两级索引的特性表的装置,所述索引从一个特性号和一个特性值映射到一个特性组。

11.如权利要求10所述的系统,其特征在于,还包括:用于寻找具有相似特性的对象的装置,包括以下装置:用于创建存储桶(OBx...OBt)以存储匹配远程对象OB的至少x个特性的本地对象的装置;

用于选择对应于对象OB的t个特性的TraitSet(TS1...TSt)的装置;

用于将索引(P1...Pt)初始化为分别指向TS1...TSt的第一个元素的装置,其中TSk[Pk]是Pk所指向的对象ID的表示法;

用于当确定P1……Pt的每一个都分别指向超过其TraitSet数组TS1……TSt的最后一个元素时,选择所需数量的相似对象的装置;

用于选择MinP组,其中所述MinP组是指向最小对象ID的索引组的装置;

用于将MinID设成MinP中所有索引所指向的最小对象ID的装置;

用于当确定k≥x并且ObjectMap(MinP)不是死的条目时,将MinID追加到OBk的装置,其中k=|MinP|,它对应于匹配特性的个数;以及用于将MinP中的每个索引Pk向前移至其各自的TraitSet数组TSk中的下一个对象ID的装置。

12.一种用于为远程差异压缩标识对象的系统,其特征在于,包括:一被配置成执行以下步骤的远程设备,所述步骤包括:接收对于对象OB的请求;

向一本地设备发送对象OB的一组特性;

将对象OB分成字节块,并为所述字节块的每一块计算签名;

向所述本地设备发送所述字节块签名列表;以及当被请求时提供所请求的字节块;以及

被配置成执行以下步骤的所述本地设备,所述步骤包括:向所述远程设备请求对象OB;

从所述远程设备接收所述对象OB的特性组;

用所述对象OB的特性组标识已存储在所述本地设备上的相似对象;

将所述相似对象分成字节块;

为所述相似对象的字节块的每一块计算签名;

从所述远程设备接收所述字节块签名列表;

将所收到的签名与所述本地计算所得的签名进行比较;

向所述远程设备请求在所述比较中不匹配的字节块;

接收所请求的字节块;以及

用收到的字节块和从所述相似对象重复使用的字节块重构对象OB。

13.如权利要求12所述的系统,其特征在于,所述本地设备还被配置成:将所述签名分组成为堆叠段;

为所述堆叠段的每一个计算至少一个堆叠段签名;

将所述堆叠段签名映射成映像组;

从所述映像组计算预特性;以及

用所述预特性计算所述特性,其中所述特性的大小小于所述预特性的大小;

用所述特性标识至少在某种程度上相似于所述对象的候选对象;以及从所标识的候选对象中选择最终对象。

14.如权利要求13所述的系统,其特征在于,将所述对象分成字节块包括:用在所述对象的每个字节位置周围的一个小窗中的字节的值,在所述每个字节位置生成指纹,以及基于所述指纹对所述对象进行分块。

15.如权利要求14所述的系统,其特征在于,在所述本地设备上将所述堆叠段映射成映像组包括:对每个堆叠段应用至少一个散列函数。

16.如权利要求15所述的系统,其特征在于,从所述映像组计算所述预特性包括应用一个确定性的数学函数,所述函数从每个映像组中选择计算所得的散列值中的一个,其中所述确定性的数学函数是从最大值函数和最小值函数中选出的。

17.如权利要求16所述的系统,其特征在于,用所述预特性计算所述特性包括对所述预特性的每一个应用一个确定性函数,从而创建每一个都具有预定比特数的特性,且所述特性的比特数少于所述预特性的比特数。

18.如权利要求14所述的系统,其特征在于,用所述特性标识至少某种程度上与所述对象相似的候选对象包括计算在所述两个对象之间匹配的特性个数。

19.如权利要求14所述的系统,其特征在于,所述本地设备还被配置成:创建紧凑地表示设备上的对象ID的对象映射关系,其中每个紧凑表示用预定大小来表示;以及创建形成至少两级索引的特性表,所述索引从一个特性号和一个特性值映射到一个特性组。

20.如权利要求19所述的系统,其特征在于,还包括:寻找具有相似特性的对象,包括以下步骤:创建存储桶(OBx...OBt)以存储匹配远程对象OB的至少x个特性的本地对象;

选择对应于对象OB的t个特性的TraitSet(TS1...TSt);

将索引(P1...Pt)初始化为分别指向TS1...TSt的第一个元素,其中TSk[Pk]是Pk所指向的对象ID的表示法;

当判定P1……Pt的每一个都分别指向超过其TraitSet数组TS1……TSt的最后一个元素时,选择所需数量的相似对象;

选择MinP组,其中所述MinP组是指向最小对象ID的索引组;

将MinID设成MinP中所有索引所指向的最小对象ID;

当确定k≥x并且ObjectMap(MinP)不是死的条目时,将MinID追加到OBk,其中k=|MinP|,它对应于匹配的特性个数;以及将MinP中的每个索引Pk向前移至其各自的TraitSet数组TSk中的下一个对象ID。

21.如权利要求20所述的系统,其特征在于,选择所需数量的相似对象包括首先从OBt选择若干对象,并递减t及从OBt中选择,直至已选择所需数量的相似对象。

22.如权利要求20所述的系统,其特征在于,选择所需数量的相似对象包括首先从OBt选择若干对象,并递减t及从OBt中选择。

说明书 :

为远程差异压缩标识对象的方法和系统

背景技术

[0001] 诸如内联网、外联网、和因特网等网络的扩张导致通过广大的网络共享信息的用户数大量增长。最大数据传输率基于与传输介质以及有关其它基础结构的限制相关联的带宽与每个物理网络相关联。有限网络带宽导致用户在通过网络检索和传输大量数据时要经历长时间的延迟。
[0002] 数据压缩技术已成为一种通过具有有限带宽的网络传输大量数据的普及方法。数据压缩一般可描述为无损的或有损的。无损压缩涉及可通过引用解压缩变换重新获得数据组原样再现的数据组变换。无损压缩最常用于在需要原样复本时压缩数据。
[0003] 在数据对象的接收者已经有该对象之前的、或较早版本的情形中,可使用一种称作远程差异压缩(RDC)的无损压缩方法来判定并仅传输该对象新与旧版本之间的差异。因为RDC传输仅涉及传输新旧版本间所观察到的差异(例如,在文件的例子中,是文件的修改或最后访问日期、文件特性、或对文件内容的少量修改),所以可大大减少所传输的数据总量。RDC可与其它无损压缩算法结合来进一步减少网络通信量。在需要在计算设备间频繁来回传送大对象、并且难以或不能维护这些对象的旧副本、因而不能使用本地差异算法的情形中,RDC的好处最为显著。

发明内容

[0004] 简而言之,本发明涉及一种为远程差异压缩寻找候选对象的方法和系统。使用远程差异压缩(RDC)技术在两个或多个计算设备间更新对象,从而将所需的数据传输最小化。在一个方面,一种算法通过允许发送者向接收者传送少量元数据,并允许接收者用此元数据来定位一组与需要从发送者传输的对象相似的对象,从而提供了改进的效率。一旦找到了这组相似对象,接收者可在RDC算法期间按照需要重复使用这些对象的任意部分。
[0005] 根据本发明的一个方面,提供了一种为远程差异压缩标识对象的方法,包括:
[0006] 计算一个对象的特性,其中计算所述对象的特性还包括:
[0007] 将所述对象分成字节块;
[0008] 为所述对象字节块的每一块计算签名;
[0009] 将所述签名分组成为堆叠段;
[0010] 为所述堆叠段的每一个计算至少一个堆叠段签名;
[0011] 将所述堆叠段签名映射成映像组;
[0012] 从所述映像组计算预特性;以及
[0013] 用所述预特性计算所述特性,其中所述特性的大小小于所述预特性的大小;
[0014] 用所述特性标识与所述对象相似的候选对象;以及
[0015] 从所标识的候选对象中选择最终对象。
[0016] 根据本发明的另一个方面,提供了一种用于为远程差异压缩标识对象的系统,包括:
[0017] 用于将一个对象分成字节块的装置;
[0018] 用于为所述对象字节块的每一块计算签名的装置;
[0019] 用于将所述签名分组成为堆叠段的装置;
[0020] 用于为所述堆叠段的每一个计算至少一个堆叠段签名的装置;
[0021] 用于将所述堆叠段签名映射成映像组的装置;
[0022] 用于从所述映像组计算预特性的装置,所述从所述映像组计算预特性的装置包括:用于应用一个确定性的数学函数的装置,所述函数从每个映像组中选择计算所得的散列值中的一个,其中所述确定性的数学函数是从最大值函数和最小值函数中选出的;
[0023] 用于用所述预特性计算所述特性的装置,其中所述特性的大小小于所述预特性的大小,使用所述特性以标识与所述对象相似的最终对象,其中所述计算所述特性的装置包括用于应用一个确定性的数学函数到每个所述预特性以创建每一个都具有预定比特数的特性的装置,且所述特性的比特数少于所述预特性的比特数。
[0024] 根据本发明的再一个方面,提供了一种用于为远程差异压缩标识对象的系统,包括:
[0025] 一被配置成执行以下步骤的远程设备,所述步骤包括:
[0026] 接收对于对象OB的请求;
[0027] 向一本地设备发送对象OB的一组特性;
[0028] 将对象OB分成字节块,并为所述字节块的每一块计算签名;
[0029] 向所述本地设备发送所述字节块签名列表;以及
[0030] 当被请求时提供所请求的字节块;以及
[0031] 被配置成执行以下步骤的所述本地设备,所述步骤包括:
[0032] 向所述远程设备请求对象OB;
[0033] 从所述远程设备接收所述对象OB的特性组;
[0034] 用所述对象OB的特性组标识已存储在所述本地设备上的相似对象;
[0035] 将所述相似对象分成字节块;
[0036] 为所述相似对象的字节块的每一块计算签名;
[0037] 从所述远程设备接收所述字节块签名列表;
[0038] 将所收到的签名与所述本地计算所得的签名进行比较;
[0039] 向所述远程设备请求在所述比较中不匹配的字节块;
[0040] 接收所请求的字节块;以及
[0041] 用收到的字节块和从所述相似对象重复使用的字节块重构对象OB。
[0042] 通过参考以下简述的附图、以下对本发明各个示例性实施例的详述、和所附的权利要求书,可以获得对本发明及其改进更完整的理解。

附图说明

[0043] 参考以下附图描述了本发明非限制性和非穷举性的实施例。
[0044] 图1图示了操作环境;
[0045] 图2图示了示例性计算设备;
[0046] 图3A和3B图示了示例性RDC过程;
[0047] 图4A和4B图示了在示例性RDC过程期间,本地设备和远程设备间交互的过程流程;
[0048] 图5A和5B图示了在RDC过程期间,在示例性交互中对签名和字节块长度列表进行递归远程差异压缩的过程流程;
[0049] 图6图示了示例性RDC序列中递归压缩的例子;
[0050] 图7图示了使用示例性RDC过程的客户和服务器应用程序的交互;
[0051] 图8图示了示例性数据分块过程的过程流程;
[0052] 图9图示了一个示例性数据分块过程的示例性指令代码;
[0053] 图10和11图示了另一个示例性数据分块过程的示例性指令代码;
[0054] 图12示出了修改成寻找和使用候选对象的RDC算法;
[0055] 图13和14示出特性计算的例子的过程;
[0056] 图15和16可在为b和t选择参数时使用;
[0057] 图17示出构成对象映像和特性表的压缩表示的数据结构;以及
[0058] 图18根据本发明的各个方面,示出计算相似特性的过程。

具体实施方式

[0059] 将参考附图具体描述本发明的各个实施例,贯穿这数张图,相同的参考标号表示相同的部件和组件。本发明的范围不受对各实施例的参考的限制,本发明的范围仅受所附权利要求书的范围限定。此外,在此说明书中阐述的任何例子都不是限制性的,而纯粹只是阐述要求保护的发明许多可能的实施例中的若干实施例。
[0060] 本发明是在其上存储了一个或多个一般相关联的对象的本地和远程计算设备(或简称“设备”)的上下文中描述的。术语“本地”和“远程”指本方法的一个实例。但是,在不同的实例中,同一个设备可同时担当“本地”和“远程”的角色。远程差异压缩(RDC)方法用于通过具有有限带宽的网络有效地更新一般相关联的对象。当具有某对象的新副本的设备需要更新某个具有同一个对象的较旧版本或相似对象的设备,则使用RDC方法,通过网络仅发送两个对象之间的差异。所描述的RDC方法的一个例子使用(1)一种发送RDC元数据的递归方法,以减少为大对象所传输的元数据的量,和(2)一种本地的基于最大值的数据分块方法,以提高与对象差异相关联的准确性,从而将带宽的使用最小化。仅举一些例子,一些受益于所述RDC方法的示例性应用程序包括:对等的复制服务、诸如SMB等文件传输协议、传输大图像的虚拟服务器、电子邮件服务器、蜂窝电话和PDA同步、数据库服务器复制。
[0061] 操作环境
[0062] 图1图示了本发明的示例性操作环境。如图所示,设备被布置成通过网络进行通信。这些设备可以是连接到网络的通用计算设备、专用计算设备、或任何其它合适的设备。网络102可对应于任何连通性拓扑结构,包括但不限于:直线连接(例如,并行端口、串行端口、USB、IEEE 1394、等等)、无线连接(例如,IR端口、蓝牙(Bluetooth)端口、等等)、有线网络、无线网络、局域网、广域网、超广域网、因特网、内联网、和外联网。
[0063] 在设备A(100)和设备B(101)之间的示例性交互中,某个对象的不同版本本地地存储在这两个设备上:对象OA在100上,对象OB在101上。在某个点,设备A(100)决定用存储在设备B(101)上的部分(对象OB)更新其对象OA的副本,并向设备B(101)发送请求以发起RDC方法。在一个替换实施例中,RDC方法可由设备B(101)发起。
[0064] 设备A(100)和设备B(101)都处理它们本地存储的对象,并将相关联的数据以数据相关的方式分成可变数量的字节块(例如,分别将对象OB分成字节块1-n,将对象OA分成字节块1-k)。两个设备都在本地为字节块计算一组强散列(SHA)等签名。两个设备都编译单独的签名列表。在RDC方法的下一个步骤期间,设备B(101)通过网络102向设备A(100)发送其计算好的签名列表和字节块长度1-n。设备A(100)将每个接收到的签名与其本身生成的签名列表1-k对比,从而评估此签名列表。签名列表中的不匹配指示对象中一个或多个需要纠正的差异。设备A(100)发送请求,让设备B(101)发送签名列表中的不匹配所标识的字节块。设备B(101)随后压缩并发送所请求的的字节块,在完成接收和解压缩之后,设备A(100)随即重新组装这些字节块。设备A(100)将收到的字节块与其本身的匹配字节块组装到一起,以获得对象OB的本地副本。
[0065] 示例性计算设备
[0066] 图2是根据本发明安排的示例性计算设备的框图。在基本配置中,计算设备200通常包括至少一个处理单元(202)和系统存储器(204)。取决于计算设备的确切配置和类型,系统存储器204可以是易失性的(诸如RAM)、非易失性的(诸如ROM、闪存、等等)或这两者的某种组合。系统存储器204通常包括操作系统(205);一个或多个程序模块(206);并可包括程序数据(207)。此基本配置在图2中由那些虚线208内的组件示出。
[0067] 计算设备200还可具有其它特征或功能。例如,计算设备200还可包括附加的数据存储设备(可移动和/或不可移动的),诸如磁盘、光盘、磁带等。此类附加的存储设备在图2中由可移动存储209和不可移动存储210示出。计算机存储介质可包括以任何方法或技术实现的易失性和非易失性、可移动和不可移动介质,用于存储诸如计算机可读指令、数据结构、程序模块或其它数据等信息。系统存储器204、可移动存储209和不可移动存储210都是计算机存储介质的示例。计算机存储介质包括,但不限于,RAM、ROM、EEPROM、闪存或其它存储器技术,CD-ROM、数字多功能盘(DVD)或其它光盘存储、磁带盒、磁带、磁盘存储或其它磁存储设备、或任何其它可用于存储需要的信息并可由计算设备200访问的介质。任何此类计算机存储介质可以是设备200的部件。计算设备200还可具有诸如键盘、鼠标、笔、语音输入设备、触摸输入设备等输入设备212。还可包括诸如显示器、扬声器、打印机等输出设备214。所有这些设备在本领域是公知的,因而无需在本文中详细讨论。
[0068] 计算设备200还包含允许该设备与其它计算设备218诸如通过网络进行通信的通信连接216。通信连接216是通信介质的一个例子。通信介质通常在诸如载波或其它传输机制等已调制数据信号中将计算机可读指令、数据结构、程序模块或其它数据具体化,并且包括任何信息传送介质。术语“已调制数据信号”意指已在信号中将信息编码的方式设置或改变其一个或多个特征的信号。作为示例,而非限制,通信介质包括诸如有线网络或直线连接等有线介质、和诸如声学、RF、微波、卫星、红外或其它无线介质的无线介质。如本文中所用的术语计算机可读介质同时包括存储介质和通信介质。
[0069] 可在驻留在系统存储器204中的一个或多个应用程序中实现各种过程和接口。在一个例子中,应用程序是安排该计算设备(例如,客户机)和另一个远程计算设备(例如,服务器)之间进行文件同步的远程差异压缩算法。在另一个例子中,应用程序是系统存储器204中所提供、用于压缩和解压缩数据的压缩/解压缩过程。在又一个例子中,应用程序是客户设备的系统存储器204中所提供的解密过程。
[0070] 远程差异压缩(RDC)
[0071] 图3A和3B根据本发明的至少一个方面,图示了示例性RDC过程。尤其是字节块的数量可根据实际对象OA和OB为每个实例改变。
[0072] 参考图3A,在两个计算设备(设备A和设备B)之间协商基本的RDC协议。RDC协议隐式地假设设备A和B具有同一个对象或资源的两个不同实例(或版本),分别由对象实例(或版本)OA和OB标识。对于此图中所示的例子,设备A有资源的旧版本OA,而设备B有在与该资源相关联的内容(或数据)中有细微的(或增量的)差异的版本OB。
[0073] 用于将已更新对象OB从设备B传输到设备A的协议在以下描述。相似的协议可用于将对象从设备A传输到设备B,并且无需显著地改变以下描述的协议,即可按设备A或设备B的要求发起传输。
[0074] 1.设备A向设备B发送请求,要求使用RDC协议传输对象OB。在替换实施例中,设备B发起传输;在此情形中,协议跳过步骤1并从以下步骤2开始。
[0075] 2.设备A将对象OA分割成字节块1-k,并为对象OA的每个字节块1……k计算签名SigAi和长度LenAi。分割成字节块将在以下具体描述。设备A存储签名和字节块长度的列表((SigA1,LenA1)……(SigAk,LenAk))。
[0076] 3.设备B将对象OB分割成字节块1-n,并为对象OB的每个字节块1……n计算签名SigBi和长度(或按字节的大小)LenBi。步骤3中所使用的分割算法必需和以上步骤2中的分割算法匹配。
[0077] 4.设备B向设备A发送其与对象OB相关联的计算好的字节块签名和字节块长度的列表((SigB1,LenB1)……(SigBk,LenBk))。设备A随后可使用字节块长度信息,通过用一组字节块的起始偏移量及其长度来标识一组字节块,来请求某特定组字节块。因为列表的序列特性,通过累加列表中所有在前的字节块的长度来计算每个字节块Bi的起始偏移量的字节数是可能的。
[0078] 在另一个实施例中,将字节块签名和字节块长度的列表发送到设备A之前将其压缩编码并使用无损压缩算法进一步压缩。
[0079] 5.一接收到此数据,设备A即将收到的签名列表与它在步骤2中为对象OA计算的与内容的旧版本相关联的签名SigA1……SigAk对比。
[0080] 6.设备A向设备B发送请求,要求在步骤4中从设备B收到的签名未能与步骤2中设备A计算的签名中的任何一个相匹配的所有字节块。对于每个被请求的数据库Bi,该请求包括步骤4中设备A计算的字节块起始偏移量和字节块长度。
[0081] 7.设备B向设备A发送与所有被请求的字节块相关联的内容。在向设备A发送之前,还可使用无损压缩算法进一步压缩设备B发送的内容。
[0082] 8.设备A用步骤7中从设备B收到的字节块和步骤4中与设备B发送的签名匹配的其本身的对象OA的字节块来重构对象OB的本地副本。在设备A上重新排列本地和远程字节块的顺序是由步骤4中设备A收到的字节块签名列表所决定的。
[0083] 分割步骤2和3可以数据相关的方式发生,该方式使用一种在相关联对象(分别在OA和OB)中每个字节位置计算的指纹函数。对于某个给定的位置,用对象中包围该位置的小数据窗来计算指纹函数;指纹函数的值取决于对象包括在该窗口中的所有字节。指纹函数可以是任何合适的函数,诸如散列函数或Rabin多项式。
[0084] 指纹函数计算出满足选定条件的对象中的位置定为字节块边界。可用密码安全散列函数(SHA),或某些诸如抗冲突散列函数等其它散列函数计算字节块签名。
[0085] 步骤4中发送的签名和字节块长度列表提供了用原来的字节块和标识为已更新的或新的字节块重构对象的基础。步骤6中被请求的字节块由其偏移量和长度标识。通过以同样的次序使用与步骤4中设备A收到的字节块的签名相匹配的本地和远程字节块,在设备A上重构对象。
[0086] 在设备A完成重构步骤之后,对象OA可被删除并由在设备A上重构的对象OB的副本取代。在其它实施例中,设备A可为将来RDC传输期间字节块可能的“重复使用”保留对象OA。
[0087] 对于大对象,图3A中所示的基本RDC协议实例导致步骤4中显著的固定额外开销,即使对象OA和对象OB很接近,或完全相同。给定平均字节块大小C,步骤4中通过网络发送的信息量与对象OB的大小成比例,具体而言它与对象OB的大小除以C,即对象OB的字节块数量成比例,并因此与步骤4中发送的(字节块签名,字节块长度)对成比例。
[0088] 例如,参考图6,一个大的图像(例如,诸如Microsoft虚拟服务器等虚拟机监视器所使用的虚拟硬盘图像)可能导致大小为9.1GB的对象(OB)。对于等于3KB的平均字节块大小C,这个9GB的对象可能导致为对象OB生成3百万个字节块,具有在步骤4中需要通过网络发送的42MB相关联的签名和字节块长度信息。即使当对象OA和对象OB之间的差异(因而步骤7中需要发送的数据量)非常小时,由于仍然必需通过网络发送这42MB的签名信息,该协议的固定额外开销过高。
[0089] 用RDC协议的一种递归应用来代替步骤4中的签名信息传输可显著减少此固定额外开销。参考图3B,如下描述了取代基本RDC算法的步骤4的额外步骤4.2-4.8。步骤4.2-4.8对应于上述基本RDC协议的步骤2-8的递归应用。还可进一步对以下的步骤4.4进行任何合乎需要的递归深度的递归应用,等等。
[0090] 4.2.设备A对其签名和字节块长度列表((SigA1,LenA1)……(SigAk,LenAk))进行递归的分块,分成递归的签名字节块,从而获得另一个递归签名和递归字节块长度的列表((RSigA1,RLenA1)……(RSigAs,RLenAs)),其中s<<k。
[0091] 4.3.设备B将签名和字节块长度列表((SigB1,LenB1)……(SigBk,LenBn))递归地分块,生成递归签名和递归字节块长度的列表((RSigB1,RLenB1)……(RSigBr,RLenBr)),其中r<<n。
[0092] 4.4.设备B向设备A发送递归签名和递归字节块长度的有序列表((RSigB1,RLenB1)……(RSigBr,RLenBr))。递归字节块签名和递归字节块长度的列表是经压缩编码的,并可在发送到设备A之前进一步用无损压缩算法进行压缩。
[0093] 4.5.设备A将从设备B收到的递归签名与步骤4.2中计算的其本身的递归签名列表进行比较。
[0094] 4.6.设备A向设备B发送请求,要求在设备A的组(RSigA1……RSigAs,)中没有匹配的递归签名的每一个不同的递归签名字节块(具有递归签名RSigBk)。
[0095] 4.7.设备B向设备A发送被请求的递归签名字节块。被请求的递归签名字节块在发送到设备A之前还可进一步用无损压缩算法进行压缩。
[0096] 4.8.设备A用本地匹配的递归签名字节块和步骤4.7中从设备B收到的递归字节块重构签名和字节块信息列表((SigB1,LenB1)……(SigBk,LenBn))。
[0097] 在完成以上步骤4.8之后,在上述基本RDC协议的步骤5继续执行,如图3A中所示。
[0098] 递归数据分块操作的一个结果是,与对象相关联的递归签名数按等于平均字节块大小C的因数缩小,从而产生显著较少的递归签名数(分别为,对于对象OA有r<<n,对于对象OB有s<<k)。在一个实施例中,可以使用和对原始对象OA和OB进行分块所用的分块参数一样的分块参数来对签名进行分块。在一个替换实施例中,对于递归步骤可使用其它分块参数。
[0099] 对于大的对象,以上递归步骤可进行k次,其中k≥1。对于为C的平均字节块大k小,递归分块可按近似对应于C 的因数减少通过网络传输的签名通信量的大小(步骤4.2到4.8)。因为C相对较大,大于1的递归深度可能仅为非常大的对象所需。
[0100] 在一个实施例中,可通过考虑包括以下各项中的一项或多项的参数来动态决定递归步骤数:期望平均字节块大小、对象OA和/或OB的大小、对象OA和/或OB的数据格式、连接设备A和设备B的网络的反应时间和带宽特征。
[0101] 步骤2中使用的指纹函数是与步骤3中使用的指纹函数相匹配的。类似地,步骤4.2中使用的指纹函数是与步骤4.3中使用的指纹函数相匹配的。步骤2-3的指纹函数可以选择性地与步骤4.2-4.3的指纹函数相匹配。
[0102] 如前所述,每个指纹函数都使用包围对象中的一个位置的小数据窗;其中与指纹函数相关联的值取决于对象包括在数据窗内的所有字节。数据窗的大小可基于一个或多个准则动态地调整。此外,在以上步骤2-3和4.2-4.3中,分块过程使用指纹函数的值和一个或多个其它分块参数来决定字节块的边界。
[0103] 通过动态改变窗的大小和分块参数,将字节块边界调整为使得任何必需的数据传输都以可用带宽的最小消耗完成。
[0104] 调整窗的大小和分块参数的示例性准则包括:与对象相关联的数据类型、环境约束、使用模型、连接设备A和设备B的网络的反应时间和带宽特征、及任何其它用于决定平均数据传输块大小的合适模型。示例性数据类型包括文字处理文件、数据库图像、数据表、演示幻灯片、和图形图像。示例性使用模型可为在一次典型数据传输中所需的平均字节数受监视的模型。
[0105] 对应用程序内部单个元素的改变可能导致对相关联数据和/或文件的若干改变。因为大多数应用程序有相关联的文件类型,所以在调整窗的大小和分块参数中文件类型是值得考虑的一个可能的准则。在一个例子中,对某文字处理文档中的单个字符的修改导致在相关联文件中大约有100字节被改变。在另一个例子中,对数据库应用程序中单个元素的修改导致数据库索引文件中1000字节被改变。对于每一个例子,合适的窗的大小和分块参数可能不同,从而分块过程具有基于具体应用程序经最优化的合适的粒度。
[0106] 示例性过程流程
[0107] 图4A和4B图示了在根据本发明的至少一个方面所安排的示例性RDC过程期间,本地设备(例如,设备A)和远程设备(例如,设备B)之间的交互的过程流程。图4A的左手边示出在本地设备A上操作的步骤400-413,而图4A的右手边示出在远程设备B上操作的步骤450-456。
[0108] 如图4A中所示,在步骤400设备A请求对象OB的RDC传输,在步骤450设备B接收此请求,交互开始。随后,本地设备A和远程设备B分别在步骤401和451中独立地计算指纹,分别在步骤402和452中将它们各自的对象分割成字节块,并分别在步骤403和453中为每个字节块计算签名(例如,SHA)。
[0109] 在步骤454,设备B向设备A发送步骤452和453中计算的签名和字节块长度列表,在步骤404设备A接收此信息。
[0110] 在步骤405,本地设备A将被请求字节块的列表初始化为空列表,并将远程字节块的跟踪偏移量初始化为0。在步骤406,从步骤404中收到的列表选择下一个(签名,字节块长度)对(SigBi,LenBi)进行考虑。在步骤407,设备A检查步骤406中选择的签名SigBi是否匹配其在步骤403期间计算的签名中的任何一个。如果它匹配,在步骤409继续执行。如果它不匹配,在步骤408将跟踪远程字节块偏移量和长度的字节数LenBi添加到请求列表中。在步骤409,将跟踪偏移量增量增加当前字节块的长度LenBi。
[0111] 在步骤410,本地设备A测试是否已经处理了步骤404中所收到的所有(签名,字节块长度)对。如果没有,在步骤406继续执行。否则,在步骤411将字节块请求列表以压缩方式适当地编码、压缩、并发送到远程设备B。
[0112] 在步骤455远程设备B接收经压缩的字节块列表,将其解压缩,随后在步骤456压缩并发回字节块数据。
[0113] 在步骤412本地设备接收并解压缩被请求的字节块。在步骤413,本地设备使用对象OA的本地副本和收到的字节块数据,重新组装OB的本地版本。
[0114] 图4B示出来自图4A的步骤413的具体示例。在步骤414继续处理,本地设备A将重构的对象初始化为空。
[0115] 在步骤415,从步骤404中收到的列表中选择下一个(签名,字节块长度)对(SigBi,LenBi)进行考虑。在步骤416,设备A检查步骤417中选择的签名SigBi是否匹配其在步骤403期间计算的签名中的任何一个。
[0116] 如果它匹配,在步骤417继续执行,将对应的本地字节块附加到重构的对象中。如果它不匹配,在步骤418将收到的并解压缩的远程字节块附加到重构的对象中。
[0117] 在步骤419,本地设备A测试是否已经处理了步骤404中收到的所有(签名,字节块长度)对。如果没有,在步骤415继续执行。否则,在步骤420用重构的对象取代设备A上对象OA的旧副本。
[0118] 示例性递归签名传输过程流程
[0119] 图5A和5B图示了根据本发明的至少一个方面安排的示例性RDC过程中签名和字节块长度列表的递归传输的过程流程。下述过程可适用于试图更新一般相关联的对象的本地和远程设备。
[0120] 图5A的左手边示出本地设备A上操作的步骤501-513,而图5A的右手边示出在远程设备B上操作的步骤551-556。步骤501-513取代了图4A中的步骤404,而步骤551-556取代了图4A中的步骤454。
[0121] 在步骤501和551,本地设备A和远程设备B分别独立地计算其在步骤402/403和452/453计算的签名和字节块长度列表((SigA1,LenA1)……(SigAk,LenAk))和((SigB1,LenB1)……(SigBk,LenBn))的递归签名。在步骤502和552,两个设备将它们各自的签名和字节块长度列表分割成递归字节块,并且分别在步骤503和553为每个递归字节块计算递归签名(SHA)。
[0122] 在步骤554,设备B向设备A发送步骤552和553中计算的递归签名和字节块长度列表,在步骤504设备A接收此信息。
[0123] 在步骤505,本地设备A将被请求的递归字节块列表初始化为空列表,并将远程递归字节块的跟踪远程递归偏移量初始化为0。在步骤506,从步骤504中收到的列表中选择下一个(递归签名,递归字节块长度)对(RSigBi,RLenBi)进行考虑。在步骤507,设备A检查步骤506中选择的递归签名RSigBi是否匹配步骤503期间它计算的递归签名中的任何一个。如果它匹配,在步骤509继续执行。如果它不匹配,在步骤508将跟踪远程递归字节块偏移量和长度的字节数RLenBi添加到请求列表中。在步骤509,用当前递归字节块的长度RLenBi增加跟踪远程递归偏移量增量字节块。
[0124] 在步骤510,本地设备A测试是否已经处理了步骤504中收到的所有(递归签名,递归字节块长度)对。如果没有,在步骤506继续执行。否则,在步骤511将递归字节块请求列表压缩编码、压缩、并发送到远程设备B。
[0125] 在步骤555远程设备B接收经压缩的递归字节块列表,解压缩列表,并随后在步骤556压缩并发回递归字节块数据。
[0126] 在步骤512本地设备接收和解压缩被请求的递归字节块数据。在步骤513,本地设备使用签名和字节块长度列表的本地副本((SigA1,LenA1)……(SigAk,LenAk))和收到的递归字节块数据,重新组装签名和字节块长度列表((SigB1,LenB1)……(SigBk,LenBn))的本地副本。随后在图4A中的405继续执行。
[0127] 图5B示出图5A的步骤513的具体示例。在步骤514继续处理,本地设备A将远程签名和字节块长度列表SIGCL初始化为空列表。
[0128] 在步骤515,从步骤504收到的列表中选择下一个(递归签名,递归字节块长度)对(RSigBi,RLenBi)进行考虑。在步骤516,设备A检查步骤515中选择的递归签名RSigBi是否匹配步骤503期间它计算的递归签名中的任何一个。
[0129] 如果它匹配,在步骤517继续执行,设备A将对应的本地递归字节块附加给SIGCL。如果它不匹配,在步骤518将收到的远程递归字节块附加给SIGCL。
[0130] 在步骤519,本地设备A测试是否已经处理了步骤504中收到的所有(递归签名,递归字节块长度)对。如果没有,在步骤515继续执行。否则,在步骤520将签名和字节块长度列表((SigB1,LenB1)……(SigBk,LenBn))的本地副本设置成SIGCL的值。随即回到图4A的步骤405继续执行。
[0131] 可以选择性地评估递归签名和字节块长度列表,以判定是否需要如前所述用额外的递归远程差异压缩将带宽使用最小化。可通过用RDC过程的另一个实例取代步骤504和554,等等,用所述分块过程递归地压缩递归签名和字节块长度列表,直至达到合乎需要的压缩级。在递归签名被充分压缩后,即返回递归签名列表,以供如前所述在远程和本地设备之间发送。
[0132] 图6是图形表示了根据示例性实施例安排的示例性RDC序列中的递归压缩的示例的框图。对于图6中所示的例子,原始对象是9.1GB数据。用分块过程编译签名和字节块长度列表,其中签名和字节块长度列表导致3百万个字节块(或42MB大小)。在第一递归步骤之后,签名列表被分割成33,000个字节块,并缩减成大小为33KB的递归签名和递归字节块长度列表。通过递归地压缩签名列表,从而动态地将用于传输签名列表的带宽使用从42MB降低到大约395KB。
[0133] 示例性对象更新
[0134] 图7图示了用根据本发明的至少一个方面安排的示例性RDC过程进行客户和服务器应用程序的交互。同时位于服务器和客户上的原始文件包含文本“The quickfox jumped over the lazy brown dog.The dog was so lazy that he didn’t notice the foxjumping over him.”。
[0135] 在随后的时间,服务器上的文件被更新为:“The quick foxjumped over the lazybrown dog.The brown dog was so lazy that he didn’t notice the fox jumping over him.”
[0136] 如前所述,客户周期性地请求更新该文件。客户和服务器均如图示将对象(文本)分成字节块。在客户上,字节块是:“The quick fox jumped”、“over the lazybrown dog.”、“The dog was so lazy that he didn’t notice”、和“the fox jumping overhim.”;生成如下客户签名列表:SHA11、SHA12、SHA13、和SHA14。在服务器上,字节块为:“The quick fox jumped”、“over the lazy brown dog.”、“The brown dogwas”、“so lazy that he didn’t notice”、和“the fox jumping over him.”;生成如下服务器签名列表:SHA21、SHA22、SHA23、SHA24和SHA25。
[0137] 如前所述服务器用递归签名压缩技术发送签名列表(SHA21-SHA25)。客户意识到本地存储的签名列表(SHA11-SHA14)不匹配收到的签名列表(SHA21-SHA25),并向服务器请求丢失的字节块3和4。服务器压缩并发送字节块3和4(“The brown dog was”和“so lazy that he didn’t notice”)。如图7中所示,客户接收经压缩的字节块,将其解压缩,并更新文件。
[0138] 分块分析
[0139] 通过最优化用于将对象数据分块和/或将签名和字节块长度列表分块的分块过程,可提高上述的基本RDC过程的效力。
[0140] 基本RDC过程有网络通信额外开销的成本,该成本由以下各项的总和标识:
[0141] (S1)|来自B的签名和字节块长度|=|OB|*|SigLen|/C,其中|OB|是对象OB的大小的字节数,SigLen是一个(签名,字节块长度)对的大小的字节数,C是期望的平均字节块大小的字节数;以及
[0142] (S2)∑字节块长度,其中(签名,字节块长度)∈来自B的签名,
[0143] 且签名 来自A的签名。
[0144] 通信成本因此得益于大的平均字节块大小和远程与本地字节块之间大的交集。如何将对象分成字节块的选择确定了协议的质量。本地和远程设备必需在没有预先通信的情况下就在何处分割对象取得一致。以下描述并分析了各种寻找切割点的方法。
[0145] 假设对于切割算法,以下特征为已知:
[0146] 1.松弛(slack):字节块在文件差异之间进行协调所需的字节数。考虑序列s1、s2、和s3,并通过串接构成两个序列s1s3、s2s3。为那两个序列生成字节块块组1(Chunks1)、和块组2(Chunks2)。如果块组1’(Chunks1’)和块组2(Chunks2’)分别是块组1和块组2的字节块长度之和,直至到达第一个共同下标,松弛的字节数由以下公式给出:
[0147] slack=Chunks1’-|s1|=Chunks2’-|s2|
[0148] 2.平均字节块大小C:
[0149] 当对象OA和OB共同具有平均大小为K的S个段,在客户上可本地获得的字节块的个数由下式给出:
[0150]
[0151] 并且以上(S2)重写为:
[0152]
[0153] 因此,将松弛最小化的分块算法将把通过网络发送的字节数最小化。
[0154] 因此使用最小化期望松弛的分块算法是有利的。
[0155] 指纹函数
[0156] 所有分块算法都使用依赖小窗(即有限的字节序列)的指纹函数,或散列函数。当散列算法服从有穷的差异(强度减弱)最优化时,用于分块的那些算法的执行时间不依赖于散列窗的大小。因此,对于大小为k的散列窗,仅用b0、bk、和#[b0,b1,……,bk-1]来计算散列#[b0,b1,……,bk]应该是很简单的(仅需常数个步骤)。可使用各种散列函数,诸如Rabin多项式,以及基于预先计算的随机数表表现得在计算上更有效率的其它散列函数。
[0157] 在一个例子中,基于滚动校验和的32位Adler散列可用作为指纹化目的的散列函数。此过程通过使用具有256个条目、每个条目都是一个预先计算的16位随机数的固定表来提供相当好的随机散列函数。该表用于将指纹化的字节转换成随机16位的数。该32位散列被分成两个16位数sum1和sum2,给定以下过程更新sum1和sum2。
[0158] sum1+=table[bk]-table[b0]
[0159] sum2+=sum l-k*table[b0]
[0160] 在另一个例子中,可将具有循环移位的64位随机散列用作为指纹化目的的散列函数。循环移位的周期受该散列值的尺寸约束。因此,使用64位散列值将散列的周期设置成64。给出如下更新散列的过程:
[0161] hash=hash^((table[b0]<<1)|(table[b0]>>u))^table[bk];
[0162] hash=(hash<<1)|(hash>>63);
[0163] 其中l=k%64且u=64-l
[0164] 在又一个例子中,可使用其它移位方法来提供指纹。直接循环移位产生有限长度的周期,并受散列值尺寸的约束。其它置换方案具有更长的周期。例如,循环(1 2 3 0)(5 67 8 9 10 11 12 13 14 4)(16 17 18 19 20 21 15)(23 24 25 26 22)(2829 27)(31 30)给出的置换方案具有长度为4*3*5*7*11=4620的周期。用右移位,接着补足每个间隔开头的位置的操作,即可计算此示例性置换方案的单个应用。
[0165] 对以预定模式分块的现有技术的分析
[0166] 以前的分块方法是通过用预定窗大小k(=48)计算指纹散列,并基于散列位的某个子集是否匹配预定模式来标识分割点来确定的。在随机散列值的情形中,此模式最好为0,并且有关子集最好为散列的前缀。在基本指令中,这翻译成以下形式的谓语:
[0167] CutPoint(hash)≡0==(hash&((1<<c)-1)),
[0168] 其中c是要对照进行匹配的位数。
[0169] 因为对给定随机散列函数匹配的概率是2-c,所以导致平均字节块大小C=2c。但是,最小或最大字节块尺寸都不由此过程决定。如果强加为最小字节块长度m,那么平均字节块尺寸是:
[0170] C=m+2c
[0171] 对期望松弛的粗略估计是通过考虑流s1s3和s2s3获得的。s1和s2中的切割点c c可在任意位置出现。因为平均字节块长度是C=m+2,s1和s2中最后的切割点的大约(2/
2 c c 2
C) 将超过距离m。它们将造成大约2 的松弛。其余的1-(2/C) 造成长度大约为C的松c 3 c 2 c 3 c 2 c-1
弛。那么期望松弛将是大约(2/C)+(1-(2/C))*(C/C)=(2/C)+1-(2/C),它在m=2c 2
有全局极小值,值近似为23/27=0.85。更精确的分析对其余1-(2/C) 部分给出稍低的估计,但也需要对在s3内距离m以内的切割进行补偿,这造成较高的估计。
[0172] 因此现有技术的期望松弛大约是0.85*C。
[0173] 在过滤器分块(新技术)
[0174] 在过滤器分块是基于固定一个过滤器,它是一系列长度为m的模式,并将指纹散列序列对照过滤器进行匹配。当过滤器不允许某个序列的散列同时匹配过滤器的前缀和后缀时,可以推断任何两个匹配之间的最小距离至少是m。可以从现有技术中使用的切割点谓语获得示例性过滤器,方法是将最先的m-1个模式设置成
[0175] 0!=(hash&((1<<c)-1))
[0176] 并将最后1个模式设置成:
[0177] 0==(hash&((1<<c)-1))
[0178] 匹配此过滤器的概率由(1-p)m-1p给出,其中p是2-c。可计算出,期望的字节块长度是由匹配过滤器(要求过滤器不允许序列同时匹配前缀和后缀)的概率的倒数给定的,-m+1 -1因此示例性过滤器的期望长度是(1-p) p 。当设p:=1/m时此长度最小化,结果大约为(e*m)。如本领域技术人员可验证的,平均松弛在0.8左右浮动。此方法的替换实施例使用直接对原始输入作用而不使用滚动散列的模式。
[0179] 在局部极大值分块(新技术)
[0180] 在局部极大值分块是基于将有限范围内的极大值选为切割点位置。在以下,我们将用h表示范围值。当在偏移量offset-h、……、offset-1、以及offset+1、……、offset+h的散列值都小于在offset的散列值,那么我们说在offset位置的散列是h-局部极大值。换言之,左边h步长和右边h步长的所有位置有较小的散列值。本领域技术人员将意识到,局部极大值可被局部极小值或任何其它基于比较的度量(诸如,“最靠近中间散列值”)取代。
[0181] 可在2·n个操作界定的时间内计算对象的局部极大值组,从而计算局部极大值的成本接近于或等于基于独立分块计算切割点的成本。用局部极大值生成的字节块总是有对应于h的最小尺寸,以及大约为2h+1的平均尺寸。在图8和9中示出切割点过程,并作如下描述:
[0182] 1.分配一个长度为h的数组M,用记录{isMax=false,hash=0,offset=0}初始化该数组的各个条目。每个字段的第一个条目(isMax)指示某候选点是否可能是局部极大值。第二字段条目(hash)指示与该条目相关联的散列值,并被初始化为0(或替换地,初始化为最大可能的散列值)。条目中最后一个字段(offset)指示该候选点在指纹化对象中绝对偏移量的字节数。
[0183] 2.在数组M中将偏移量最小和最大初始化为0。这些变量指向数组当前使用中的第一个和最后一个元素。
[0184] 3.CutPoint(hash,offset)在图8中的步骤800开始,并且在对象的每个偏移量处被调用以更新M并返回指示某具体偏移量是否是切割点的结果。
[0185] 在步骤801设置result=false,该过程开始。
[0186] 在步骤803,该过程检查是否满足M[max].offset+h+1=offset。如果此条件为真,在步骤804继续执行,执行以下任务:将结果设为M[max].isMax,and max is set to max-1%h。随即在步骤805继续执行。如果在步骤803条件为假,则在步骤805继续执行。
[0187] 在步骤805,该过程检查是否满足M[min].hash>hash。如果条件为真,则在步骤806继续执行,将min设为(min-1)%h。在步骤807继续执行,将M[min]设为{isMax=false,hash=hash,offset=offset},并前进至步骤811,返回计算结果。
[0188] 如果在步骤805条件为假,则在步骤808继续执行,该过程检查是否满足M[min].hash=hash。如果此条件为真,则在步骤807继续执行。如果在步骤808条件为假,则在步骤809继续执行,该过程检查是否满足min=max。如果此条件为真,则在步骤810继续执行,将M[min]设为{isMax=true,hash=hash,offset=offset}。随即在步骤811继续执行,返回计算结果。
[0189] 如果在步骤809条件为假,则在步骤811继续执行,将min设为(min+1)%h。随即返回步骤805继续执行。
[0190] 4.当CutPoint(hash,offset)返回真,则处于offset-h-1位置的偏移量是新切割点是成立的。
[0191] 局部极大值过程的分析
[0192] 具有n个字节的对象是通过调用CutPointn次来处理的,从而最多为给定对象插入n个条目。每次重复开始于步骤805的循环时就移除一个条目,从而不会有超过n个条目要删除。因此,对于每个条目可进入该处理循环一次,且重复的合计次数可最多为n。这表示每个对CutPoint的调用处循环内的平均步骤数略少于2,并且计算切割点的步骤数不依赖于h。
[0193] 因为从各元素得出的各个散列值构成了min和max之间的降序链,我们可以看到,min和max之间的平均距离(|min-max|%h)是由h的自然对数给出的。不包括在M中两个邻近条目之间的偏移量具有小于或等于该两个条目散列值。此类链的平均长度是由递归方程f(n)=1+1/n*∑k<nf(k)给定的。在长度n间隔上的最长降序链的平均长度比从最大元素位置开始的最长降序链的平均长度大1,其中最大元素可以在任意位置以1/n的概率找到。递归关系有对应于调和数Hn=1+1/2+1/3+1/4+……+1/n的解,这可通过将Hn代入方程并对n进行归纳而得到验证。Hn是与n的自然对数成比例。因此,尽管分配数组M大小为h,在任何一次都只用了大小ln(h)的一小部分。
[0194] 以模数h计算min和max允许所用的M间隔任意地增长,只要各个数之间的距离还在h之内。
[0195] 对M的初始值的选择指示可以在第一h偏移量内生成切割点。可改编该算法以避免在这最前h偏移量内有切割点。
[0196] 此过程生成的字节块的期望大小是2h+1左右。我们根据某给定位置是切割点的概率获得此数字。假设散列有m个不同的可能值。那么此概率由下式决定:
[0197] ∑0≤k<m 1/m(k/m)2h
[0198] 用积分近似∫0≤x<m 1/m(x/m)2hdx=1(2h+1)在m充分大时指示此概率。
[0199] 可通过首先简化该和,来以下式更精确地计算此概率:
[0200] (1/m)2h+1∑0≤k<m k2h
[0201] 使用贝努利数Bk展开上式成:
[0202] (1/m)2h+1 1/(2h+1)∑0≤k<2h (2h+1)!/k!(2h+1-k)!Bk m2h+1-k[0203] 非零的唯一奇贝努利数是B1,它有对应值-1/2。偶贝努利满足等式:
[0204] H∞(2n)=(-1)n-122n-1π2n B2n/(2n)!
[0205] 左手边表示无限和1+(1/2)2n+(1/3)2n+……,即使对于适中的n值来说,此和已接近于1。
[0206] 当m大于h很多时,如我们通过积分所看到的,除了第一项之外的所有项都可被忽k-1 k略。它们由0和1之间的某个常数乘以某个与h /m 成比例的项给定。第一项(其中B0
2
=1)简化为1/(2h+1)。(第二项是-1/(2m),第三项是h/(6m))。
[0207] 考虑流s1s3和s2s3以对期望松弛进行粗略估计。s1和s2内的最后的切割点可能出现在任意位置。因为平均字节块长度是大约2h+1,所以在s1和s2中,大约最后的切割点的1/4都会在距离h内。它们会造成在大约7/8h处的切割点。在这些例子的另外1/2,一个切割点将在距离h之内,而另一个超过距离h。这些造成在3/4h附近的切割点。s1和s2中最后的切割点的其余1/4将在大于h的距离。因此期望松弛大约为1/4*7/8+1/2*3/4+1/4*1/4=0.66。
[0208] 因此,我们的独立分块方法的期望松弛是0.66*C,对于现有技术的(0.85*C)来说是一个进步。
[0209] 标识切割点有一种替换方法,该方法需要执行平均较少的指令,并且使用最多与h成比例、或平均为ln h的空间,上文中的过程为长度为n的流中的每个位置0……n-1插入条目。本替换方法中的基本思想是仅当遇到长度为h的间隔内的升序链的元素时才进行更新。我们观察到平均每个间隔只有ln h次此类更新。此外,通过比较两个连续的长度为h的间隔中的局部极大值,可以判定这两个局部极大值中的每一个是否还可能是h局部极大值。本替换过程有一个特点:它要求通过在大小为h的块中遍历该流来计算升序链,其中每个块都被反向遍历。
[0210] 在替换过程中(见图10和11),为简单起见我们假设给定某散列流作为序列。为每个长度为h(在图中扩充为“horizon”(范围))的子序列调用子例程CutPoint。它返回0或确定为切割点的偏移量。对Insert的调用中仅ln h次会通过第一次测试。
[0211] 对A所进行的插入是通过测试对于A中目前位置最大条目偏移量处的散列值来达成的。
[0212] 可将同时更新A[k]和B[k].isMax的循环最优化,从而在循环体内平均仅进行一次测试。B .hash<=A .hash and B .isMax的情况是在两个循环中得到处理的,第一个循环对照B .hash检查散列值,直至它不更小,第二个循环更新A[k]。其它情况可用仅更新A[k]接着更新B .isMax的循环来处理。
[0213] 每次对Cutpoint的调用平均要求对A进行ln h次存储器写,并且循环提起h+ln h次涉及寻找极大值的比较。可通过二进制搜索或通过以平均最多ln h个步骤从索引0开始遍历B来对A[k].isMax进行最后一次的更新。每次对CutPoint的调用还要求在正被更新的窗口的last位置处重新计算滚动散列。这采用和滚动散列窗的大小一样的很多步骤数。
[0214] 对改进的分块算法所观察到的优点
[0215] 最小字节块大小被同时构建到上述的局部极大值和过滤器方法中。常规的实现要求以额外常数单独提供最小字节块大小。
[0216] 基于局部极大(或数学的)方法产生可测的较佳松弛估计,这意味着在网络上的进一步压缩。过滤器方法也产生优于常规方法的松弛性能。
[0217] 两种新方法都具有切割点的局部性特性。s3内所有超过horizon范围的切割点将同时是流s1s3和s2s3的切割点。(换言之,考虑流s1s3,如果p是≥|s1|+horizon的某个位置并且p是s1s3中的切割点,那么它也是s2s3中的切割点。同样的特性在另一个方向也成立(对称的),如果p是s2s3中的切割点,那么它也是s1s3中的切割点。)。这对常规方法不成立,常规方法中切割要超过某个最小字节块尺寸的要求可能产生逆反干扰。
[0218] 替换的数学函数
[0219] 尽管上述分块过程描述了一种用局部极大值计算来定位切割点的手段,本发明并不限于此。可安排任何数学函数可来检查潜在的切割点。通过评估位于在所考虑的切割点附近的horizon窗内的各散列值来评估每个潜在的切割点。散列值的求值是由数学函数达成的,它可包括定位horizon内的极大值、定位horizon内的极小值、求两个散列值间的差、求两个散列值间的差并将结果对比某任意常数、以及某些其它数学或统计函数中的至少一项。
[0220] 之前为局部极大值所描述的具体数学函数是二进制谓语“_>_”。对于p是对象中的偏移量的情形,如果对于所有k,有hashp>hashk,则p被选作切割点,其中,p-horizon≤k<p或p<k≤p+horizon。但是二进制谓语>可被任何其它数学函数取代,而不会偏离本发明的精神。
[0221] 为远程差异压缩寻找候选对象
[0222] 通过分别为RDC算法的步骤4和8期间签名和字节块的重复使用寻找接收者上的候选对象,可提高上述基本RDC过程的效力。该算法帮助设备A标识记为OA1、OA2、……、OAn的对象的小子集,它们和要用RDC算法从设备B发来的对象OB很相似。OA1、OA2、……、OAn是已存储在设备A上的对象的一部分。
[0223] 两个对象OB和OA之间的相似性是以两个对象共有的不同的字节块数除以第一个对象中不同字节块的总数来衡量的。因此如果块组(OB)和块组(OA)分别是RDC算法为OB和OA计算的字节块组,那么,用表示法|X|来记组X的势,或元素个数:
[0224]
[0225] 作为字节块等式的代表,使用字节块的签名上的等式。如果用密码安全散列函数(诸如SHA-1或MD5)计算签名,给定散列冲突的概率极低,那么这是高度准确的。因此,如果签名组(OB)和签名组(OA)是在RDC算法的分块部分为OB和OA计算的字节块签名组,那么:
[0226]
[0227] 给定存储在设备A上的对象OB和一组对象ObjectsA,ObjectsA中与OB有超过给定阈值s的相似度的成员被标识出来。s的典型值是s=0.5(50%相似)即,我们对至少有一半字节块和OB相同的对象感兴趣。但是s的值可设为对于该应用程序来说合理的任何值。例如,s可设在0.01和1.0之间(1%相似到100%相似)。此对象组定义为:
[0228] Similar(OB,ObjectsA,s)={OA |OA∈ObjectsA ∧Similarity(OB,OA)≥s}[0229] 通过取最好的n个匹配,计算出Similar(OB,ObjectsA,s)的一个子集即对象组OA1、OA2、……、OAn。
[0230] 将上述基本RDC算法作下述修改,以标识并利用相似对象组OA1、OA2、……、OAn。
[0231] 图12根据本发明的若干方面表示修改成寻找并利用候选对象的RDC算法。描述了用于在设备A上寻找并利用候选对象和将已更新对象OB从设备B传输到设备A的协议。相似的协议可用于将对象从设备A传送到设备B,并且传输可在设备A或设备B的要求下发起,而无需显著改变下述协议。
[0232] 1.设备A向设备B发送请求,要求用RDC协议传输对象OB。
[0233] 1.5设备B向设备A发送对象OB的一组特性,特性组(OB)。一般而言,这些特性是涉及对象OB的性质的压缩表示。如稍后将描述,设备B可将OB的这些特性高速缓存,从而设备B无需在将这些特性发送到设备A之前重新计算它们。
[0234] 1.6设备A用Traits(OB)标识OA1、OA2、……、OAn,这是设备A已存储的对象的一个子集,该对象子集与对象OB相似。这个判定是以概率方式作出的。
[0235] 2.设备A将被标识的对象OA1、OA2、……、OAn分成字节块。通过使用在对象的每个字节位置计算的指纹函数,以数据相关的方式发生分割。在指纹函数满足某给定条件的位置上确定字节块的边界。分成字节块之后,设备A为每个对象OAi的每个字节块k计算签名SigAik。
[0236] 3.用与步骤2中相似的方法,设备B将对象OB分成字节块,并为每个字节块计算签名SigBj。步骤3中使用的分区算法必需匹配以上步骤2中的分区算法。
[0237] 4.设备B向设备A发送字节块签名列表(SigB1……SigBn)。此列表提供让设备A能够重构对象OB的基础。除了字节块签名SigBi以外,还会发送关于对象OB中每个字节块的偏移量和长度的信息。
[0238] 5.当设备A从设备B收到字节块签名,它将收到的签名对比它在步骤2中计算的签名组(SigA11、……SigA1m、……、SigAn1、……SigAn1)。作为此比较的一部分,设备A记录每个它从设备B收到的不匹配在对象OA1、OA2、……、OAn的字节块上计算所得的其本身的签名中之一的各自的签名值。
[0239] 6.设备A向设备B发送请求,要求所有在上一步骤从设备B收到其签名、但在设备A上没有匹配签名的字节块。基于在步骤4中发送的对应信息,用在对象OB中的偏移量和长度来请求这些字节块。
[0240] 7.设备B向设备A发送与所有被请求的字节块相关联的内容。
[0241] 8.设备A通过使用步骤6中从设备B收到的字节块、以及其本身对象OA1、OA2、……、OAn的匹配步骤4中设备B发送的签名的字节块,来重构对象OB。在完成此重构步骤之后,设备A现在可以将对象OB的重构副本添加到其已经存储的对象中。
[0242] 为了将网络通信量和CPU额外开销最小化,Traits(OB)应该非常小,且对相似对象组OA1、OA2、……、OAn的判定应以在设备A上的非常少的操作来进行。
[0243] 计算对象的特性组
[0244] 对象O的一组特性Traits(O),是基于为O所计算的字节块签名来计算的,分别如RDC算法的步骤2和3所述。
[0245] 图13和14根据本发明的若干方面,示出特性计算的过程和例子。
[0246] 用于标识相似对象的算法有如下述的4个主要参数(q,b,t,x)。
[0247] q:堆叠段(shingle)大小
[0248] b:每个特性的位数
[0249] t:每个对象的特性个数
[0250] x:最小匹配特性个数
[0251] 以下步骤用于计算对象O的特性、-Traits(O)。
[0252] 1.在框1310,O的字节块签名Sig1……Sign被分组成为重叠的大小为q的堆叠段,其中每个堆叠段包括q个字节块签名,除了包含少于q个签名的最后q-1个堆叠段。其它分组方式(不连续子集、分离子集)是可能的,但是插入一个额外的签名使得所有之前被考虑的子集仍被考虑在实践上是有用的。
[0253] 2.在框1320,对每个堆叠段1……n,通过串接构成该堆叠段的q个字节块签名来计算堆叠段签名Shingle1……Shinglen。对于q=1的情形,Shingle1=Sig1、……、Shinglen=Sign。
[0254] 3.在框1330,通过对t个散列函数H1……Hn的应用,将堆叠段组{Shingle1……Shinglen}映射到t个映像组。这产生了t个映像组,每个包含n个元素:
[0255] IS1={H1(Shingle1),H1(Shingle2),……,H1(Shinglen)}
[0256] ISt={Ht(Shingle1),Ht(Shingle2),……,Ht(Shinglen)}
[0257] 4.在框1340,取每个映像组的最小元素来计算预特性PT1……PTt:
[0258] PT1=min(IS1)
[0259] PTt=min(ISt)
[0260] 也可使用其它确定性的数学函数来计算预特性。例如,取每个映像组的最大元素来计算预特性PT1……PTt:
[0261] PT1=max(IS1)
[0262] PTt=max(ISt)
[0263] 在数学上,任何将值实现为有序组的映射方式都是足够的,有界整数的最大值和最小值是两种简单的实现。
[0264] 5.在框1350,从每个预特性PT1……PTt中选出b位来计算特性T1……Tt。为了保留采样的独立性,如果预特性充分长的话,最好选择不重复的位片段,对第一个选0……b-1,对第二个选b……2b-1,等等:
[0265] T1=select0..b-1(PT1)
[0266] Tt=select(t-1)b..tb-1(PTt)
[0267] 可用任何确定性函数来创建尺寸上小于预特性的特性。例如,可对每个预特性应用某个散列函数,只要结果的尺寸小于预特性的尺寸;如果所需的总位数(tb)超过预特性的大小,那么应该使用某些散列函数,在选择子集之前扩展位数。
[0268] 选择特性个数t和特性大小b使得仅需很少的总位数(t*b)来表示对象的特性。如下所述,如果设备A预先计算特性并将其高速缓存,则这是有利的。根据一个实施例,对于每个对象共96个位,已经找到的一些效果很好的(b,t)参数的典型组合是例如(4,24)和(6,16)。也可使用任何其它组合。为了解释的目的,对象A的第i个特性记为Ti(A)。
[0269] 有效地选择预特性
[0270] 为了有效地选择预特性PT1……PTt,使用以下方法,允许对堆叠段进行局部评价,因而降低了选择预特性的计算要求。逻辑上,每个Hi分成两部分,Highi和Lowi。因为仅选择每个映像组的最小元素,为每个字节块签名计算Highi,且仅为那些达到了Highi所达到的最小值的字节块签名计算Lowi。如果各个高位值是从较小空间得出的,则这可节省计算。如果,进一步将若干高位值捆绑在一起,可能可以显著节约计算。例如,假设每个高位值是
8位长。可将8个高位组装成长整数;以从签名计算单个8字节散列的成本,该值可被分成
8个独立的1字节片段。如果仅需高位值,这将降低计算成本8倍。但是,平均256次中的一次才需要计算相应的低位值,并将其与对应于相等高位值的其它低位值相比较。
[0271] 用特性组寻找相似对象
[0272] 该算法通过计算与OB具有相似特性的对象组,来逼近与某给定对象OB相似的对象组:
[0273] TraitSimilarity(OB,OA)=|{i|Ti(A)=Ti(B)}|
[0274] similarTraits(OB,ObjectsA,x)={OA|OA ∈ObjectsA ∧TraitSimilarity(OB,OA)≥t}
[0275] 可得出这些值的其它计算也可获得同样的效果。
[0276] 为了选择与某个给定对象OB最相似的n个对象,计算SimilarTraits(OB,ObjectsA,x),并从该组中取n个最匹配的对象。如果SimilarTraits(OB,ObjectsA,x)的大小小于n,则取全组。所得对象组构成图12中所示的修正RDC算法的步骤1.6中标识的潜在的对象组OA1,OA2,……,OAn。根据各实施例,可按相似性指导来选择对象,但还通过选择类似于目标、但彼此不相似的对象,或通过从具有相似特性的对象组中作其它选择,来尽量提高对象组中的差异性。
[0277] 根据一个实施例,可使用以下参数(q,b,t,x)的组合:(q=1,b=4,t=24,x=9)和(q=1,b=6,t=16,x=5)。
[0278] 根据本发明的若干方面,当选择参数b和t时,可使用图15和16。图15中首先示出(b=4,t=24)的检测匹配概率曲线和假肯定曲线,然后图16中示出(b=6,t=16)的检测匹配概率曲线和假肯定曲线。两组相似性曲线(1510和1610)都允许对真相似性在0-100%范围内的相似对象进行概率检测。根据一个实施例,视图1520和1620中示出的假肯定率跌至在大约24个中的10个(提供40位的真匹配)和16个中的6个(36位匹配)的可接受级别;所需位数中的差异主要是由于从较小的组获得减少的组合数。较大组的优点是提高的查全率:较少的有用匹配会漏过注意;成本是增大的错误地检测到的匹配的比率。为了同时改善精度和查全率,可增加总位数。例如,切换成(b=5,t=24)将以为对象特性增加存储器消耗为成本而显著增加精度。
[0279] 特性组的压缩表示
[0280] 设备A和设备B同时为其所存储的对象高速缓存特性组是有利的,从而它们不必在每次执行修正RDC算法(见图12及有关讨论)步骤1.6和1.5时分别重新计算其特性。为了加速RDC的计算,特性信息可分别存储在设备A和设备B的存储器中。
[0281] 以下所述的表示对每个对象用大约t+p要求的存储器字节,其中t是特性个数,p是存储到对象的引用或指针所需的字节数。引用的例子有文件路径、文件标识符、或对象标识符。对于t和p的典型值,此方法可用少于50MB主存储器来支持一百万个对象。如果某设备存储更多对象,则它可使用试探来削减在相似性计算中涉及的对象的个数。例如,可预先排除很小的对象,因为它们不可能在图12中所示的RDC算法的步骤4和8中造成太多的字节块。
[0282] 图17根据本发明的若干方面,示出组成以下各项的压缩表示的数据结构:一个ObjectMap和一组t个Trait Table。
[0283] 起初,向所有对象分配短标识符,或对象ID。根据一个实施例,这些标识符是连续的非负4字节整数,因此允许表示最多40亿个对象。
[0284] 数据结构(ObjectMap)维护从对象ID到对象引用的映射。存储在设备上的对象以什么次序获取分配对象ID是没有关系的。起初,可通过简单地完整扫描设备所存储对象的列表来完成此分配。如果某对象获删除,ObjectMap中其对应的条目即被标记为死的条目(通过使用对象引用的某个保留值)。如果对象被修改,ObjectMap中其对应的条目即被标记为死的条目,且该对象将分配下一个较高的未使用对象ID。
[0285] 当ObjectMap过于稀疏(这种情况可由跟踪死的条目的总的大小和总个数来简单地判断),ObjectMap和Trait Table都被弃置并从暂存区重建。
[0286] Trait Table构成从一个特性号(1-t)和一个特性值(0-2b-1)映射到某TraitsSet的两级索引,该TraitsSet是具有该特定特性的对象的对象ID组。TraitsSet表示为尾部具有若干未使用过的条目供存储新对象的数组。索引IXi,k跟踪每个TraitsSet数组中的第一个未使用过的条目,以允许增补。
[0287] 在TraitsSet内,某特定对象组按对象ID的升序存储。因为对象ID的空间保持密集,所以可以期望TraitsSet中连续的条目在对象ID空间中彼此“靠近”——平均而言,两b b个连续的条目应该相差大约t*2(但至少差1)。如果选择t和b的值使得t*2 <<255,那么平均可仅用一个表示两个对象ID间的差异的无符号字节来编码连续的条目,如图17中所示。通过使用0x00字节来指示接下来跟着一个完整的4字节对象ID,为2个连续对象ID相差超过255的罕见情况提供了一种逸出机制。
[0288] 根据一个不同的实施例,如果对象ID差小于256那么它可由单个字节表示,否则保留0值来指示随后的字节表示δ-256,即,通过使用一种8选7的表示。然后,对于b=6,98%的δ可被一个字节容纳,99.7%可被两个字节容纳,10亿个中的两个以外的其余所有都可被3个字节容纳。已经发现,与图17中所示方案的每个对象1.08个字节相比,此方案平均每个对象使用1.02个字节。
[0289] 特性表中对应于死对象的ID的条目可留在特性表中。新的条目附在末端(用索b引IX1,0……IXt,2-1)。
[0290] 用压缩表示来寻找相似对象
[0291] 图18根据本发明的若干方面,示出寻找具有相似特性的对象。根据一个实施例,要计算SimilarTraits(OB,ObjectsA,x),步骤和合并排序算法是相似的。该算法使用(t-x+1)个对象存储桶OBx……OBt,这些存储桶分别用来存储属于对象组A至少匹配x次及以上、并且包括OB的t个特性的对象。
[0292] 1.在框1810,选择对应于OB的t个特性的t个TraitSet:TS1……TSt。初始化OBx……OBt为空。将索引P1……Pt初始化为分别指向TS1……TSt的第一个元素。TSk[Pk]是Pk所指向的对象ID的表示法。
[0293] 2.在判定框1820,如果所有P1……Pt都分别指向超过其特性组数组TS1……TSt的最后一个元素,那么前进至步骤6(框1860)。
[0294] 3.在框1830,选择MinP组,它是指向最小对象ID的索引组,如下:
[0295]
[0296] 使MinID为MinP中所有索引所指向的最小对象ID。
[0297] 4.在框1840,使k=|MinP|,它对应于匹配的特性个数。如果k≥x并且ObjectMap(MinP)不是死的条目,那么将MinID附加到OBk。
[0298] 5.将MinP中的每个索引Pk向前移至其各自的TraitSet数组TSk中的下一个对象ID。回到步骤2(框1820)。
[0299] 6.在框1860,通过首先从OBt选择若干对象,然后从OBt-1选择若干对象,等等,直至已选择所需数量的相似对象或OBx中不再有其它对象留下,从而选择了相似对象。以上步骤所产生的对象ID可用ObjectMap容易地映射成对象引用。
[0300] 以上说明书、示例和数据提供了对本发明结构的制造和使用的完整描述。因为可以做出本发明的许多实施例而不会偏离本发明的精神和范围,所以本发明驻留在所附的权利要求书中。