几周前我在一次演示中看到了它,试图实现它,但失败了,然后就忘记了。但现在我想知道它是如何工作的 =)
这是一种有效传输/存储数据的方式。它适用于任何语言。这就是(我认为)它的作用:
您有 1 个非常大的文件(例如网站的整个 javascript 集合)。
- 将其拆分为 48 字节的块
- 散列每个 48 字节的块(例如 MD5)
- 在以 0x00 结尾的哈希上拆分块列表
- 大块(>= 1 个哈希)现在应该是不同的大小。有的很大,有的很小。
- 在这些哈希之间粘贴块(再次:实际数据的大小非常不同)
- 散列这些块
- 现在你有一个代表大文件当前版本的哈希列表
这个想法是,当大文件中的一段代码发生变化时,只有 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 encoding
和Rabin fingerprints
。