原使用taskpool处理分片对md5的异步处理,但一次系统更新后方法无法使用了;故有此次修改大文件获取MD5值耗时过长应用会卡退,所以块获取MD5值对最终获取到的相同MD5值所用的时间会相对较短;使用方法如下
原先方法(js cryptojs):

@Concurrent
function getMd5Hash(chunk:ArrayBuffer){
  // let wordArray: ESObject = CryptoJS.lib.WordArray.create(item);
  // return wordArray
}
// getFileMD5(): string {
//   const md5Hash: ESObject = CryptoJS.algo.MD5.create()
//   const startTime = new Date().getTime()
//   const chunks = this.getChunks()
//   let md5: string = ''
//   if (!chunks) {
//     const wordArray: ESObject = CryptoJS.lib.WordArray.create(this.buf.buffer);
//     md5 = CryptoJS.MD5(wordArray).toString();
//   } else {
//     chunks.forEach(chunk => {
//       taskpool.execute(getMd5Hash, chunk).then(res=>{
//         md5Hash.update(res)
//       })
//     })
//     md5 = md5Hash.finalize().toString(CryptoJS.enc.Hex)
//   }
//   logUtil.info([`花费${new Date().getTime() - startTime}ms, 生成文件MD5值`])
//   return md5
// }


新方法:(鸿蒙api)

async getFileMD5()  {
  try {
    const startTime = new Date().getTime()
    const chunks = this.getChunks()

    if (!chunks || chunks.length === 0) {
      let md = cryptoFramework.createMd('MD5');
      md.updateSync({data:new Uint8Array(this.buf.buffer)})
      let mdOutput = await md.digest();
      console.info("md result: " + mdOutput.data)
      return buffer.from(mdOutput.data).toString('hex')
      logUtil.info([`花费${new Date().getTime() - startTime}ms, 生成文件MD5值`])
    } else {
      console.log('切片获取MD5')

      let md = cryptoFramework.createMd('MD5');
      for (let i=0 ; i<chunks.length ;i++){
        let updateMessageBlob: cryptoFramework.DataBlob = { data: new Uint8Array(chunks[i]) };
        await md.update(updateMessageBlob)
      }

      let mdOutput = await md.digest();
      console.info("md result: " + mdOutput.data)
      return buffer.from(mdOutput.data).toString('hex')

      logUtil.info([`花费${new Date().getTime() - startTime}ms, 生成文件MD5值`])
    }
  }catch (err){
    console.log('获取MD5报错了:',JSON.stringify(err))
    throw (new Error('获取MD5报错了'))
  }
}
Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐