最近在做一个文件上传的项目,当上传文件达到几十GB,几百GB后在文件上传99%后,需要等待非常长的时间文件才能完成上传。通过埋点打印时间,发现md5计算时间非常长。
为了校验文件传输的完整性需要在文件上传结束后校验文件的完整性,md5值就用来校验完整性,所以这一步不能少。
解决方案
通过网上查找资料,MD5计算工具在计算大文件md5值时也不是一次性计算出来的,也是通过分片的方式累加计算出来的。
所以我们在上传大文件时,本来上传的思路就是分片上传,我们只需要对每块分片进行md5计算,最后累加计算md5值即可。
通过网上google发现了一篇介绍node通过crypto加密模块实现md5加密的方法,里面的介绍很详细,里面介绍了最快速计算md5的方法:
require('crypto').createHash('md5').update(data).digest('hex')
update中传入每片数据的二进制流。通过测试发现每块分片计算的md5时间为20多毫秒,速度提升了几十倍。