一、MD5计算将整个文件或者字符串,通过其不可逆的字符串变换计算,产生文件或字符串的MD5散列值。任意两个文件、字符串不会有相同的散列值(即“很大可能”是不一样的,理论上要创造出两个散列值相同的字符串是很困难的)。
二、因此MD5常用于校验字符串或者文件,以防止文件、字符串被“篡改”。因为如果文件、字符串的MD5散列值不一样,说明文件内容也是不一样的,即经过修改的,如果发现下载的文件和给的MD5值不一样,需要慎重使用。
三、MD5文件校验用途非常多,例如:游戏补丁包的校验,病毒文件确认,APP提审校验等;如果要确认某一个文件的完整性和正确性,都会使用MD5进行校验。
安装
npm i spark-md5 // 安装spark-md5
复制代码
全局引入spark-md5
import SparkMD5 from "spark-md5";
Vue.prototype.$SparkMD5 = SparkMD5
复制代码
或者在tool.js封装处理方法
import SparkMD5 from "spark-md5";
/**
* @description: md加密
* @param {*
* file:文件对象
* chunkSize:单位大小
* }
* @return {*}
*/
const tool = {
md5(file, chunkSize) {
return new Promise((resolve, reject) => {
let blobSlice =
File.prototype.slice ||
File.prototype.mozSlice ||
File.prototype.webkitSlice;
let chunks = Math.ceil(file.size / chunkSize);
let currentChunk = 0;
let spark = new SparkMD5.ArrayBuffer(); //追加数组缓冲区。
let fileReader = new FileReader(); //读取文件
fileReader.onload = function(e) {
spark.append(e.target.result);
currentChunk++;
if (currentChunk < chunks) {
loadNext();
} else {
let md5 = spark.end(); //完成md5的计算,返回十六进制结果。
resolve(md5);
// console.log(md5);
}
};
fileReader.onerror = function(e) {
reject(e);
};
function loadNext() {
let start = currentChunk * chunkSize;
let end = start + chunkSize;
if (end > file.size) {
end = file.size;
}
fileReader.readAsArrayBuffer(blobSlice.call(file, start, end));
}
loadNext();
});
}
};
export default tool;
复制代码
调用:
handleFileChange(e) {
const [file] = e.target.files;
if (!file) return;
this.tool
.md5(file, SIZE)
.then(res => {
// 获取到文件的md5
this.params.md5 = res;
})
.catch(res => {
// 处理异常
console.error(res);
});
Object.assign(this.$data, this.$options.data()); // 还原初始data对象
this.container.file = file;
},
复制代码
后记:
切片上传的情况之下,有的需求是每一个切片md5值,有的情况下是整个文件的值
“d41d8cd98f00b204e9800998ecf8427e”指的是空字符串
spark.end()类似“剪切”,只能粘贴一次!也就是只能使用第一次,如果第二次使用的话就是传出空字符串SparkMD5的优势是啥?
SparkMD5是MD5算法的快速md5实现。该脚本基于JKM md5库,该库是最快的算法。对JKM md5的改进像大多数服务器端算法一样,字符串被转换为utf8修正大量数据的计算(溢出)增量md5支持数组缓冲区(类型化数组)功能封装在闭包中,以避免全局分配面向对象的库CommonJS(可在节点中使用)和AMD集成通过JSHint和JSCS传递的代码增量md5对于散列大量数据(例如文件)的性能要好得多。可以使用FileReader&Blob读取成块的文件,并为md5哈希附加每个块,同时保持较低的内存使用率。请参见下面的示例。
|