这个哈希/缓存/版本控制算法叫什么名字?

3

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

这是一种高效传输/存储数据的方法。它可以在任何语言中使用。这是我认为它所做的事情:

你有一个非常大的文件(例如整个网站的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 (所以它实际上是Microsoft研究!很棒!)

从第一个链接中:

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

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

关键字是Delta encodingRabin fingerprints


2
很可能你记错了一些细节,因为如果在文件开头插入一个字节,所有哈希值都会改变。也许你应该对每个长度为48字节的运行块进行哈希,而不是对整个块进行哈希。 - Antti Huima
是的,我知道 =) 那就是我卡住的地方!但是对每个48字节的运行进行哈希处理,就相当于对文件大小(以字节为单位)- 47次进行哈希处理。(这可能是10或100万次!)那肯定不是最好的方法。那么这还有意义吗? - Rudie
3个回答

3
这听起来有点像远程差分压缩的工作原理;在低带宽文件系统(LBFS)[24]中,使用RDC协议来优化发送方和接收方之间的通信,双方将所有文件细分为块并计算强校验和或签名。当客户端需要从服务器访问或复制文件时,后者首先向客户端传输该文件的签名列表,客户端确定哪些旧块可用于重构新文件,并请求缺失的块。这个协议的关键在于文件的划分是独立于客户端和服务器的,通过从数据特征确定块边界实现。PDF链接:http://research.microsoft.com/apps/pubs/default.aspx?id=64692

听起来有点像。我记得(但我不确定)有一个更奇特的名字...我正在寻找它所在的演示文稿。 - Rudie

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

+1 对于“滚动哈希”和“rsync” =) 这可能是他们的意思。不过听起来对我来说需要很多工作... - Rudie

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接