3

几周前我在一次演示中看到了它,试图实现它,但失败了,然后就忘记了。但现在我想知道它是如何工作的 =)

这是一种有效传输/存储数据的方式。它适用于任何语言。这就是(我认为)它的作用:

您有 1 个非常大的文件(例如网站的整个 javascript 集合)。

  1. 将其拆分为 48 字节的块
  2. 散列每个 48 字节的块(例如 MD5)
  3. 在以 0x00 结尾的哈希上拆分块列表
  4. 大块(>= 1 个哈希)现在应该是不同的大小。有的很大,有的很小。
  5. 在这些哈希之间粘贴块(再次:实际数据的大小非常不同)
  6. 散列这些块
  7. 现在你有一个代表大文件当前版本的哈希列表

这个想法是,当大文件中的一段代码发生变化时,只有 1 或 2 个哈希值发生变化。使用新文件,您执行上述所有步骤,并且只上传/下载实际更改的部分(块,可通过其哈希识别)。根据更改的代码量以及围绕该代码的块的大小,您永远不需要下载超过 4 个块。(而不是整个文件。)然后通信的另一端将用新块替换原始块(相同算法,相同功能)。

听起来有点熟?他们提到了一个名字,但在上面找不到任何东西。当我尝试构建它时,它只是没有用,因为如果你不完全更改 48 字节 [1],那么更改 [2] 之后的所有哈希都是不同的......

如果有人知道这个名字:太好了。如果有人也可以解释一下:完美!

更新
我找到了它所在的演示文稿。它在新产品“Silo”中被提及(并被使用) : http ://research.microsoft.com/apps/pubs/default.aspx?id=131524相关:http: //channel9.msdn.com/Events/MIX/MIX11/RES04(所以它实际上是微软的研究!很好!)

从第一个链接:

启用 Silo 的页面将此本地存储用作 LBFS 样式的块存储。

在第二个链接(视频)中,好东西从6:30. 现在我已经看过两次了...我仍然不明白 =)

关键字是Delta encodingRabin fingerprints

4

3 回答 3

3

您可以使用滚动哈希解决“不是块大小倍数的更改”问题。这就是 rsync 用来仅传输文件的更改部分的方法。

于 2011-04-30T16:47:47.357 回答
3

这听起来……有点……像远程差分压缩的工作原理;

在低带宽文件系统 (LBFS) [24] 中,RDC 协议用于优化发送方和接收方之间的通信,方法是让双方将所有文件细分为块并为每个块计算强校验和或签名. 当客户端需要从服务器访问或复制文件时,后者首先将该文件的签名列表传输给客户端,客户端确定其哪些旧块可用于重建新文件,并请求丢失的块. 该协议的关键是通过从数据特征确定块边界,文件在客户端和服务器上独立划分。

PDF http://research.microsoft.com/apps/pubs/default.aspx?id=64692

于 2011-04-30T16:36:06.083 回答
1

这听起来很像shingling

于 2011-04-30T16:43:25.867 回答