文件快速上传和下载原理

<1>Remote端(服务器端)数据的处理
没必要去实现这个算法。直接调用库就可以了。
chunk一块一块的数据块
1. 将Remote端(服务器端)的数据按照Chunck进行切分
2. 计算每一个chunk的弱校验和(Adler-32算法)与强校验和(MD5算法)
3. 保存进Map中,key为弱校验ID,value为chunk链表
 Map>

<2>Local 端处理(本地端)
1. 读取一个Chunck  判断数据是否够一个chunck大小
2. 根据读取到的Chunk 去Remote的Map中判断是否匹配. 如果匹配上看之前是否有differ Data ,如果有Differ Data则将diff Data加入patch中.
最终会得到一个以匹配上的chunk index + differ Data的链表


如果不匹配,就右移动一个字节,左边剩下的那个字节叫differ date,是服务器里没有的字节,是需要上传的字节。

differ date(**)
**01**02**03****0x  服务器收到的数据
然后匹配填充形成新数据
新数据 = differ date(客户端穿上来的)+ 服务器里已有的匹配数据

这种算法的优缺点:节省了上传的文件大小,但是牺牲了CPU(CPU需要不停地计算,占用了CPU)

网页是不能读取本地文件(处于安全考虑);所以有时需要装插件。

 
原文地址:https://www.cnblogs.com/kelan/p/5284490.html