Published: October 1, 2025
9
43
293

google 的 cdc-file-transfer 是一个文件同步程序,亮点是比 rsync 的速度快几倍。那么它是如何实现的呢? rsync 是一个非常悠久且高效的远程文件(夹)同步程序,当它发现某个文件数据改变需要传输新内容时,它并不会整个文件上传,而是把文件按照固定大小(比如100 kb)切分并结算每一块的hash

在 remote 端,对目标文件作相同大小的切分和计算hash,然后 local 端把hash序列发送给remote作对比,最后只上传新的或者发生更改的块(block)。这种去重算法能避免上传整个文件,但如果文件是在中间插入新的数据,那么就会导致这个节点后面的block hash全都改变了。 cdc则改进了文件切分的方法:

在 cdc-file-transfer 里,使用了一种叫 gear based 的切分方法,算法:预先生成随机数组 gear_table[256],然后读取文件的每一个字节值b,计算hash = (hash << 1) + gear_table[b],当 (hash & mask) == 0 时(mask是预期每个块的大小,每 2^n 字节,n 为 mask 的位数,每位都是1)就分为一个block.

用这种方法切分的 block 因为不是固定大小的,所以即使原文件中间被插入了或者删除了部分数据,都不会导致后续的所有block hash更改,所以除重率比rsync的固定大小切分法高很多。对于app store或者steam之类的大文件同步很有帮助。 对这个算法感兴趣的看: https://github.com/google/cdc-...

@hemashushu it often split at the special bytes which meet it's hashing method. to make it easier to understand, can roughly compare it to splitting a text file at line breaks. however, its splitting method is more complex.

@tmk56427984 gear hash 就是简单地对每一个字节的值(对应的一个随机数表)的 位左移 和一个“加法,这种粗糙的 hash 能保证不消耗太多计算资源,然后当 hash 值末几位同时为零时作为切割点,这步非常巧妙:1 保证产生的概率,2 如果头几位相同大概率内容也是相同的(最后搭配强hash判断),跟依据\n切割还不太一样

@hemashushu dropbox也有增量同步

@hemashushu 学习了,可以尝试用在p2p 上

@hemashushu 原来如此,cdc-file-transfer 用变动块切割技术,比 rsync 更快,真是个好工具!

@hemashushu 可惜的是代码已经被归档,后面不维护了。

@hemashushu 6,一看 repo 还是 2 年前的老代码。更有趣的是,Google Drive 今年才支持差分/增量更新 https://workspaceupdates.googl...

@hemashushu 这么好的东西为啥不火呢

Share this thread

Read on Twitter

View original thread

Navigate thread

1/13