md5 = DigestUtils.md5Hex(encryptedData); // 计算md5值 request.setAttribute("news", filename + " 上传成功! md5值为:" + md5);
时间: 2024-02-15 22:44:31 浏览: 58
这段代码是使用 Apache Commons Codec 库中的 DigestUtils 类来计算给定字符串的 MD5 哈希值。具体来说,md5Hex 方法接受一个字符串参数,返回该字符串的 MD5 哈希值的十六进制表示形式。
接下来,将上传成功的文件名和计算出的 MD5 值存储在 request 对象的属性中,以便在后续的请求中可以方便地访问这些值。最后,返回一个字符串,提示用户上传成功,并显示计算出的 MD5 值。
相关问题
import { Sha256 } from '@aws-crypto/sha256-js' import CryptoJs from 'crypto-js' import encHex from 'crypto-js/enc-hex' onmessage = async function (event) { const data = event.data // 获取文件数据 // chunk方式读取文件 const chunkSize: number = 1024 * 1024 // 每次读取1MB const fileSize: number = data.size // 文件大小 let offset: number = 0 // 偏移量 const createSha256Uint8Array32 = new Sha256() // SHA256 Unit8Array(32) const createSha1 = CryptoJs.algo.SHA1.create() // SHA1 Hex const createSha256 = CryptoJs.algo.SHA256.create() // SHA256 Hex const createSha512 = CryptoJs.algo.SHA512.create() // SHA512 Hex const createMD5 = CryptoJs.algo.MD5.create() // MD5 while (offset < fileSize) { const chunk = new Uint8Array(await data.slice(offset, offset + chunkSize).arrayBuffer()) // 读取chunkSize大小的文件块 const wordArray = CryptoJs.lib.WordArray.create(chunk) createSha256Uint8Array32.update(chunk) createSha1.update(wordArray) createSha256.update(wordArray) createSha512.update(wordArray) createMD5.update(wordArray) offset += chunkSize // 计算进度 // const progress = Math.min(100, Math.round((offset / fileSize) * 100)) // 计算进度 // console.log(progress) // 打印进度 // postMessage({ progress, offset, fileSize }) // 将进度发送给主线程 } const [sha256Uint8Array32, sha1, sha256, sha512, md5] = await Promise.all([ createSha256Uint8Array32.digest(), // SHA256 Unit8Array(32) encHex.stringify(createSha1.finalize()), // SHA1 Hex encHex.stringify(createSha256.finalize()), // SHA256 Hex encHex.stringify(createSha512.finalize()), // SHA512 Hex encHex.stringify(createMD5.finalize()), // MD5 ]) const obj = { md5, // MD5 sha1, // SHA1 Hex sha256, // SHA256 Hex sha512, // SHA512 Hex sha256Int8Array32: Array.from(new Int8Array(sha256Uint8Array32)), // SHA256 Int8Array(32) } console.log(obj) // 打印结果对象 postMessage(obj) // 将结果对象发送给主线程 } 增加功能计算 sm3
需要在代码中增加计算 SM3 哈希值的功能,可以使用第三方库 jsrsasign 来实现。具体步骤如下:
1. 在代码头部导入 jsrsasign 库:
```javascript
import { Sha256 } from '@aws-crypto/sha256-js'
import CryptoJs from 'crypto-js'
import encHex from 'crypto-js/enc-hex'
import { SM3 } from 'jsrsasign'
```
2. 在 while 循环中计算 SM3 哈希值:
```javascript
const createSM3 = new SM3() // 创建 SM3 对象
createSM3.updateBinary(chunk) // 输入文件块
```
3. 在 Promise.all 中加入 SM3 哈希值的计算:
```javascript
const [sha256Uint8Array32, sha1, sha256, sha512, md5, sm3] = await Promise.all([
createSha256Uint8Array32.digest(), // SHA256 Unit8Array(32)
encHex.stringify(createSha1.finalize()), // SHA1 Hex
encHex.stringify(createSha256.finalize()), // SHA256 Hex
encHex.stringify(createSha512.finalize()), // SHA512 Hex
encHex.stringify(createMD5.finalize()), // MD5
createSM3.digest() // SM3
])
```
4. 将 SM3 哈希值加入结果对象:
```javascript
const obj = {
md5, // MD5
sha1, // SHA1 Hex
sha256, // SHA256 Hex
sha512, // SHA512 Hex
sha256Int8Array32: Array.from(new Int8Array(sha256Uint8Array32)), // SHA256 Int8Array(32)
sm3: Array.from(new Int8Array(sm3)) // SM3 Int8Array
}
```
完整代码如下:
import { Sha256 } from "@aws-crypto/sha256-js"; import SparkMD5 from "spark-md5"; onmessage = async function (event) { const data = event.data; // chunk方式读取文件 const chunkSize = 1024 * 1024; // 每次读取1MB const fileSize = data.size; let offset = 0; const hash = new Sha256(); const spark = new SparkMD5.ArrayBuffer(); while (offset < fileSize) { const chunk = data.slice(offset, offset + chunkSize); const buffer = await chunk.arrayBuffer(); hash.update(buffer); spark.append(buffer); offset += chunkSize; } const sha256Value = await hash.digest('hex'); const sha256Buffer = Array.from(new Int8Array(sha256Value)); const md5Value = spark.end(); console.log(sha256Value, sha256Buffer); // 输出文件的sha256值 console.log(md5Value); // 输出文件的MD5值 postMessage(sha256Buffer); }; 优化代码,使其能够计算sha256
这段代码已经可以计算文件的sha256哈希值了,如果您想要进一步优化代码,可以考虑以下几点:
1. 使用TypedArray类型
在代码中,将sha256哈希值转换成Int8Array类型时,先将其转换成了字符串类型,然后再将其转换成Int8Array类型。这样的操作比较繁琐,也会占用较多的内存。可以直接使用Uint8Array类型来存储哈希值,这样更加简洁和高效。例如:
```javascript
const sha256Value = await hash.digest();
const sha256Buffer = new Uint8Array(sha256Value);
```
2. 使用Blob.slice方法
在代码中,使用了File.slice方法来分块读取文件。实际上,Blob对象也提供了slice方法,可以使用它来进行分块读取。这样可以简化代码,并且不需要将文件转换成File对象。例如:
```javascript
const chunk = data.slice(offset, offset + chunkSize);
```
可以改为:
```javascript
const chunk = new Blob([data], { type: data.type }).slice(offset, offset + chunkSize);
```
3. 使用Promise.all方法
在代码中,哈希计算是串行进行的,即先计算sha256哈希值,再计算MD5哈希值。可以考虑使用Promise.all方法来并行计算,这样可以更快地得到结果。例如:
```javascript
const [sha256Value, md5Value] = await Promise.all([hash.digest(), spark.end()]);
```
将以上优化操作应用到代码中,可以得到如下代码:
```javascript
import { Sha256 } from "@aws-crypto/sha256-js";
import SparkMD5 from "spark-md5";
onmessage = async function (event) {
const data = event.data;
const chunkSize = 1024 * 1024; // 每次读取1MB
const fileSize = data.size;
let offset = 0;
const hash = new Sha256();
const spark = new SparkMD5.ArrayBuffer();
while (offset < fileSize) {
const chunk = new Blob([data], { type: data.type }).slice(offset, offset + chunkSize);
const buffer = await chunk.arrayBuffer();
hash.update(buffer);
spark.append(buffer);
offset += chunkSize;
}
const [sha256Value, md5Value] = await Promise.all([hash.digest(), spark.end()]);
const sha256Buffer = new Uint8Array(sha256Value);
console.log(sha256Value, sha256Buffer); // 输出文件的sha256值
console.log(md5Value); // 输出文件的MD5值
postMessage(sha256Buffer);
};
```
阅读全文