在文件存储中如何判断文件的唯一性,从而减少内存的使用?
需求:我们在存储文件时时常遇到需要判断文件是否存在的业务场景,如果文件存在就不上传,如果不存在就上传,一般情况都会使用到文件内容的MD5来检查是否重复。
痛点: 但是如果文件小还好说,如果文件大到一定程度,本身取MD5也是相当消耗时间的,这样一来就会影响到接口的性能,但是我们又不可能不做MD5的提取,某些业务场景对于文件的重复性相当的严苛。
解决方案:遇到这种情况我们可以使用采样法来做MD5的检查:
一:比如一个100M的文件,取第1,11,21,31,41,51....91M的内容组合生成MD5作为快速MD5
这样大大提升了MD5生成的效率,同时可通过控制采样率,采样大小,和采样位置来调节。
二:这种快速MD5虽然不能绝对判断文件是否存在,但是它可以判断文件不存在,如果在相同的采样率下,快速MD5没有匹配成功,至少说明这个文件在服务器上是不存在的,可以直接上传。
三:如果快速MD5匹配成功,说明我们的服务器 有可能 存在这个文件,因为快速MD5并不是绝对的,如果文件的改动完美的避开了采样就会出现重复判断不正确的情况,所以在文件相同时我们需要判断文件的全文MD5才能保证绝对。(如果用户平凡上传重复的大文件这里会很慢,毕竟不能不判断全文MD5,如果有好的解决方案请评论留言,先谢谢了。)
四:至于全文MD5在什么时候生成呢?像这种费时的事情启动一个定时任务来做就行了,反正暂时也不需要用到。只要不让用户大大等太久就可以了。