我知道 RDC 是分布式文件系统复制 (DFSR) 使活动目录中所有共享设备上的数据保持同步的方式。我只知道 RDC 将数据拆分成块,然后将每个块散列为所谓的签名。签名集从服务器传输到客户端。客户端将服务器签名与自己的签名进行比较。然后,客户端请求服务器仅发送客户端上尚不存在的签名的数据。
我不明白的是这句话来自微软:
“RDC 通过计算指纹识别函数的局部最大值将文件的数据划分为块,该函数在文件中的每个字节位置计算。指纹识别函数是一种可以增量计算的哈希函数。例如,如果您在文件中的一系列字节 Bi...Bj 上计算函数 F,那么就应该能够通过添加字节 Bj+1 并减去字节 Bi 来增量计算 F(Bi+1...Bj+1)。文件中的字节范围 Bi...Bj 称为哈希窗口。此窗口的长度(以字节为单位)称为哈希窗口大小。
RDC 库的 FilterMax 签名生成器通过添加窗口前沿的字节并减去窗口后沿的字节,在整个文件中“滑动”哈希窗口。同时,生成器不断检查给定字节范围内的指纹函数值序列,称为范围大小。如果指纹函数值是范围内的局部最大值,则选择其字节位置作为“切点”或块边界。
将文件分成多个块后,签名生成器会为每个块计算一个强哈希值(MD4 哈希值),称为签名。签名可用于比较文件的两个任意不同版本的内容。
由于签名文件的大小随原始文件的大小线性增长,因此比较非常大的文件可能会非常昂贵。通过将 RDC 算法递归应用于签名文件,可以大大降低此成本。例如,如果原始文件大小为 9 GB,则签名文件大小通常约为 81 MB。如果将 RDC 算法应用于签名文件,则生成的二级签名文件大小约为 5.7 MB。”
我不明白的是两件事:这些“可以增量计算”的东西与 RDC 的工作方式有什么关系?递归如何帮助减少带宽?
答案1
关于“增量”的部分只是说哈希窗口可以通过从窗口前面取一个字节并将下一个字节添加到窗口末尾来“滑动”。因此,窗口可以从文件的开头增量滑动到结尾,以检测文件实例之间的“移位”。例如,假设您有一个文本文档。指纹是从该文本文档的数据块生成的。然后,稍后,您将一段文本添加到该文本文档的开头。窗口可以从开头开始,并在文件中递增,直到它与已经具有指纹的块匹配。
关于递归性部分,假设您有一个由字节“ABCD”组成的数据块,另一个由字节“GHIJ”组成的数据块。每个块可能具有“01”和“02”的指纹,或四个字节。该算法不会传输所有四个字节,而是采用“0102”的指纹(两个指纹合在一起),这可能会产生“03”的指纹。如果目标文件具有相同的指纹指纹,则可以假定所有底层块均未更改,不需要传输。