背景:今天硬盘塞满了,一边下载一边想腾出点儿空间来。发现有份博德之门 2 的压缩包还留着,于是就打算传到百度云然后把本地的删了,文件分 p 还蛮大的心理预期要费点儿时间的,没想到触发了百度云的秒传,四个 part 里只有一个最小的没触发要一点点上传,也算大大减少了时间。印象中以前看过有人说原理是比对 md5 ,这次顺便想搜搜看有没有更多的讲解。

随手搜了一下,大多数还是简单的说是 md5 比对。但也有少量的不同意见,说自己的原创文件也会触发秒传,其中既包括完全原创的文件,也包括压缩包内添加内容后重新上传的。这就比较奇怪了,如果真的是单纯比对 md5 的话不应该出现这样的情况的。

于是,就又多看了几篇不同平台不同人写的回复,根据出现的情况整理了一下大概是这样的:应该比较肯定是指纹比对,md5 是比较常见所以比较可能的方法,对于大文件应该是辅以 slice md5 (有人在上传请求中确实看到了提交完整 md5 和 slice md5,但 slice md5 不是必须的)和文件大小以及文件名(优先度最低)。最后这四种有优先级地交叉采用一种到全部,选取的机制可能比较灵活所以才会出现 1 这样的情况。

至于有人提到其他的更不容易撞的 hash 算法,我个人觉得可能性不是很大,因为基本可以肯定早期是用的 md5 ,这样就存在些许的沉没成本要为巨量的已有文件重新计算 hash,而同时即便更改了 hash 算法同样无法摆脱大文件 hash 计算机时间长的问题,还是要采取切片计算,这样更改的必要就更小了。

最后对于完全原创文件触发秒传的情况,可能的情况比较少见且难以复现验证,个人只能想出两种猜测:1. 可能撞 md5 ,与文件大小相近的文件撞 md5,这种情况将文件下载下来应该与其本人文件不同,不过经历者没有讲述是否有将秒传的文件下载下来查看,所以仅作猜测。2. 比较险恶的猜测,可能百度云存在偷偷上传用户文件的行为,例如可能掩盖在其他文件上传过程中上传一些常见格式文件。

摘取的部分知乎言论:

最近在做一个简易的网盘的项目,计算整个文件的md5很费时间,更何况在服务器查询,应该是用了简易的指纹技术(比如只计算某些块的md5和当前的时间等信息合成一个新的md5)这样效率上来了,而且文件的唯一性也有一定的确保。不过还是有重复的可能。

秒传机制是一样的,而且slice md5好像不是必须提供的。不提供就增加了风险而已。会员只限制速度和最大文件大小。

也希望百度能來解釋一下這個問題。我有些工程文件也會打包加密后用百度網盤備份,普遍1G以上且絕無僅有,然而經常會遇見被極速秒傳的案例。

应该是给你一个假象已经传完了。然后后台自己偷偷慢慢在传

我的想法是,小于一定大小的文件,直接算hash. 大文件先切块,然后针对块来算hash.以hash来确定是否要上传该块.

百度云是md5+文件长度,好像还有前32k的crc32做辅助验证,但是可以不提供。

MD5 百万文件里面会有hash冲突。和MD5类似的,sha256 hash 冲突会小很多。

度盘标准提取码生成器:原理是利用文件完整md5、前256kb片段md5、文件大小及名字生成一个标准提取码。

猜测为校验文件大小+MD5,但是这种算法已被科大证明会被破解。

  1. 这个急速上传有bug,比如我之前上传过一个文件叫做《各路番号集合》。某日我发现了新的番号,就将以前的文件下载,并将内容更新,因为添加了几个字符,文件大小变化不大,而且文件名也没有改变。当我修改完,重新上传时,就会自动启用急速上传,上传的文件竟然是我修改之前的内容,添加的内容没有了。