2011-04-30 24 views
3

几周前我在演示中看到它,试图实现它,失败并忘记了它。但现在我想知道它是如何工作=)这个哈希/缓存/版本控制算法的名称是什么?

这是一种有效的传输/存储数据的方式。它可以用任何语言工作。这是什么(我认为)它:

你有1个非常大的文件(例如一个网站的整个JavaScript集合)。

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

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

听起来很熟悉吗?他们提到了一个名字,但是找不到任何东西。当我试图构建它时,它只是不起作用,因为如果你不改变正好48个字节[1],那么在所述改变[2]之后的所有哈希值是不同的...

如果someonw知道名字:很好。如果有人可以解释它:完美!

UPDATE
我发现展示它在它的新产品“筒仓”提到(和使用):http://research.microsoft.com/apps/pubs/default.aspx?id=131524相关:http://channel9.msdn.com/Events/MIX/MIX11/RES04(!所以这实际上是微软研究纯)

从第一环节:

启用仓-A页面链接到本本地 存储作为LBFS式chunkstore。

在第二个链接(视频)中,好东西从6:30开始。现在我已经看到了两次...我仍然没有得到它=)

关键字是Delta encodingRabin fingerprints

+2

如果你在文件的开头插入一个字节,所有散列值都会改变,你很可能会记得一些细节错误。这可能是你应该散列每个48字节而不是块的运行。 – 2011-04-30 16:50:35

+0

是的,我知道=)这就是我卡住了!但是,每次运行48个字节时,散列的次数与文件大小以字节为单位 - 47次相同。(如果不是1000年的100个,那么这个数字就是10)!那不可能。那么它就不值得了!? – Rudie 2011-04-30 17:28:31

回答

3

这听起来......有点......比如远程差分压缩如何工作;

在低带宽文件系统 (LBFS)[24],一个RDC协议由具有 两侧细分所有其 文件的成块用于 优化 发送方和接收方之间的通信并计算每个 块的校验和或签名。当客户端需要访问 或从服务器复制一个文件时, 后者第一该文件到 客户端,它确定哪一个其 旧块可以被用来重建 新文件发送的 签名列表,并请求 丢失的块。这个协议的关键在于通过确定数据特征的边界 ,在客户端 和服务器上独立划分的文件是 。

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

+0

它听起来很像它。我记得(但我没有)一个更具有异国情调的名字,虽然...我正在寻找它的演示文稿。 – Rudie 2011-04-30 17:31:43

3

使用rolling hashes可以解决“不是块大小的倍数”的问题。这是rsync用来传输文件的更改部分的内容。

+0

+1滚动哈希和rsync的=)这可能是他们的意思。听起来像很多工作,但我... – Rudie 2011-04-30 17:45:14

相关问题