几周前我在一次演示中看到了它,试图实现它,但失败了并忘记了。但现在我想知道它是如何工作的 =)
这是一种高效传输/存储数据的方法。它可以在任何语言中使用。这是我认为它所做的事情:
你有一个非常大的文件(例如整个网站的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 (所以它实际上是Microsoft研究!很棒!)
从第一个链接中:
启用Silo的页面将此本地存储用作LBFS样式的块存储。
在第二个链接(视频)中,好东西从6:30
开始。现在我已经看了两次...我仍然不明白 =)
关键字是Delta encoding
和Rabin fingerprints
。