在我们使用百度云盘上传文件的时候,有的时候一个上百兆甚至更大的文件,秒级上传。这其中一定是云盘识别了文件的唯一标识,所以根本就无需上传,直接提示的上传成功。这不仅在使用云盘服务的时候感受到了急速体验,也极大的节省后台的存储资源。
这里的说的文件唯一标识不是文件的名字唯一,而是说用一段字符串来唯一标识出文件的内容。之前也接参考过一套源码文件上传服务,每个上传的文件都是采用MD5计算出文件唯一名称,将文件存储在服务器的一个文件目录下,每次上传新文件,都会先根据文件MD5标识查重。
不论文件大小,MD5都会生成一个固定长度的字符串,例如我这里生成的都是这样的32位字符串831a3cf0f43dc6b1f12a75fa22ed3bf5
。说实话,这个名字太长,当然存储在后台的磁盘里也没啥关系,但是如果放到URL中,或是文本编辑器中
将上面两个图中的文件标识提出来对比下
http://elef.top/831a3cf0f43dc6b1f12a75fa22ed3bf5.png (32位)
https://jianshu/5833359-7edc5133cc79aa42.png (7 + 1 + 16 = 24位)
第一个文件标识采用md5算法生成,虽然保证了文件的唯一,但是明显过长。
第二个文件标识采用两种算法生成,左侧7位采用CRC32生成,右侧16位应该是md5算法生成后截取的一半。
第二个标识生成的规则给出了一个新的思路,采用md5和crc32两种算法相结合,再进行适当的截取字符串,这样即可以保证标识的唯一性也能有效的减少字符串的长度。
md5和crc32有啥区别
简单来说,crc32算法比md5算法在对同样一个文件进行摘录,耗时短,但同时摘录的信息量也少,所以只能做初筛选。对比多个文件是否重复的时候,首先采用crc32算法,如果两个文件的crc32摘录不一样,那两个文件肯定不重复,但是如果crc32摘录一样,那也不能说明两个文件重复。这时,md5摘录可以做进一步对比,这样对比的结果才是确定的。
网友评论