首页 > 其他分享 >大文件 MD5 SHA 校验时间优化之路

大文件 MD5 SHA 校验时间优化之路

时间:2023-09-08 18:22:46浏览次数:34  
标签:count 文件 val 校验 SHA 分片 path MD5

最近研发apk校验服务,很多游戏安装包两三个G,如果整个拿去校验,耗时基本二十多秒,这还仅仅是校验的时间,如果加上下载的时间,等待时间太长了

网上很多方案尝试了一下,不太行

1、fast md5

一个第三方库,csdn有人用过说可以提升40%的速度,然后我去试了一下,本来9秒可以完成的校验,变成了2分多钟,我真是口吐莲花

2、把MD5替换成SHA算法

提升不明显,哪怕从30秒缩短到20几秒,依然接受不了

所以只能寻求其它方案了

分片校验法

很多上传下载大文件,会采用分片的方法去做,这样就可以开启多个任务对同一个文件进行操作,速度提升好几倍

如法炮制,先写个demo尝试一下,看看是否可行

先把文件进行分片,找个几百M的apk测试一下

private fun verifySpilt() {
        filesDir?.let { path ->
            val it = File(path.absolutePath + "/test.apk")
            tvContent?.text = "${path.absolutePath}/test.apk"
            val inputStream = FileInputStream(it)
            var out: FileOutputStream? = null
            val inChannel = inputStream.channel
            var outChannel: FileChannel? = null

            val m = (10 * 1024 * 1024).toLong()
            // 分片数量
            val count = (it.length() / m).toInt()
            Log.e("--==", "count $count")
            for (i in 0..count) {
                // 生成文件的路径
                val tPath = "${path.absolutePath}/test_$i"
                val toFile = File(tPath)
                if (toFile.exists()) {
                    toFile.mkdir()
                }
                Log.e("--==", "to path $tPath")
                try {
                    out = FileOutputStream(toFile)
                    outChannel = out.channel
                    // 从inChannel的m*i处,读取固定长度的数据,写入outChannel
                    if (i != count) inChannel.transferTo(
                        m * i,
                        m,
                        outChannel
                    ) else {
                        // 最后一个文件
                        inChannel.transferTo(m * i, it.length() - m * count, outChannel)
                    }
                } catch (e: IOException) {
                    Log.e("--==", "IOException $e")
                    return
                } finally {
                    out?.close()
                    outChannel?.close()
                    Log.e("--==", "finally close")
                }
            }
            inputStream.close()
            inChannel.close()
        }
    }

对 test.apk 进行分片校验

直接在 demo 工程里面 main方法调用

得到了十来个片段文件

接下来写个校验方法,对其中的片段文件校验,比如分片后,删了这些片段文件在重新生成,md5值是否一致

private fun verify(position: Int) {
        filesDir?.let { path ->
            val it = File(path.absolutePath + "/test1_$position")
            val digest = MessageDigest.getInstance("MD5")
            val fis = FileInputStream(it)
            val channel = fis.channel
            val byteBuffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, it.length())
            digest.update(byteBuffer)
            val bytes = digest.digest()
            tvContent?.text = bytes2HexString(bytes)
            Log.e("--==", "${bytes2HexString(bytes)}")
        }
    }

打印的日志发现一致,说明只要切片的方式一样,是可以进行校验的

然后我改了分片的逻辑,每个片段大小调整了一下,得到5个片段,此时结果肯定就不一致了

其实到这里已经算成型了,居然分片可行,那么一个大文件直接分成10份,同时验证,然后对比结果,速度可不止快了一倍

后面是无聊尝试的结果,肯定是没问题的,否则就要考虑代码的问题了

找个视频加一个新建的text文本,文本里面输入111,然后压缩,得到 test1 的压缩包

然后修改文本变成1111,在压缩,得到 test2 压缩包,在赋值 test1 压缩包 得到 test1_copy 压缩包,一共三个文件

把文件复制到内存目录中测试

结果没问题,毕竟是整个文件直接校验

标签:count,文件,val,校验,SHA,分片,path,MD5
From: https://www.cnblogs.com/LiuZhen/p/17688291.html

相关文章

  • 3. Oracle数据库异常关闭,导致错误3. Oracle数据库异常关闭,导致错误ERROR: ORA-01034:
    之前由于电脑没电,强制关机,导致Oracle数据库异常关闭,再次启动电脑登陆数据库时,发生以下错误:当我尝试重新启动数据库时,发生错误:经过查阅资料后得知:缺少INITXE.ORA文件,需要从下图目录中复制到上图指定目录中,并重命名为initXE.ora即可(这里initxxx.ora中的xxx要取决于你的SID)再......
  • 昇腾实践丨ATC模型转换动态shape问题案例
    本文分享自华为云社区《ATC模型转换动态shape问题案例》,作者:昇腾CANN。ATC(AscendTensorCompiler)是异构计算架构CANN体系下的模型转换工具:它可以将开源框架的网络模型(如TensorFlow等)以及AscendIR定义的单算子描述文件转换为昇腾AI处理器支持的离线模型;模型转换过程中,ATC会进行......
  • 昇腾实践丨ATC模型转换动态shape问题案例
    本文分享自华为云社区《ATC模型转换动态shape问题案例》,作者:昇腾CANN。ATC(AscendTensorCompiler)是异构计算架构CANN体系下的模型转换工具:它可以将开源框架的网络模型(如TensorFlow等)以及AscendIR定义的单算子描述文件转换为昇腾AI处理器支持的离线模型;模型转换过程中,ATC会进行算......
  • [Maven] maven插件系列之maven-shade-plugin
    [Maven]maven插件系列之maven-shade-plugin1插件简述/PluginOverview1.1定义与目的/Definition&GoalsOfficialDefinitionApacheMaven:maven-shade-pluginThispluginprovidesthecapabilitytopackagetheartifactinanuber-jar,includingitsdependenc......
  • Android入门教程 | res资源目录简介与shape的绘制和使用
    res资源目录简介简单介绍Android工程中的资源目录(resources),res。Android里的资源指的是什么?资源是指代码使用的附加文件和静态内容,例如位图、布局定义、界面字符串、动画说明等。把资源放进对应的目录后,可使用在项目R类中生成的资源ID来访问这些资源。形如R.drawable.icon,R.la......
  • 通过pyshark解析pcap报文
    代码:importpysharkdefextract_dns_info(packet):dns=packet.dnsquery_name=dns.qry_nameifhasattr(dns,'qry_name')elseNonequery_type=dns.qry_typeifhasattr(dns,'qry_type')elseNone#解析响应的IP地址或其他响应内容r......
  • 循环冗余校验(CRC)算法入门引导
    写给嵌入式程序员的循环冗余校验(CRC)算法入门引导前言CRC校验(循环冗余校验)是数据通讯中最常采用的校验方式。在嵌入式软件开发中,经常要用到CRC算法对各种数据进行校验。因此,掌握基本的CRC算法应是嵌入式程序员的基本技能。可是,我认识的嵌入式程序员中能真正掌握CRC算法的人却很少,......
  • .netcore 使用iTextSharp生成pdf文件
     使用Nuget添加iTextSharp引用主要代码usingiTextSharp.text.pdf;usingiTextSharp.text;usingSystem.IO;usingAutoMapper;usingSystem.Linq;usingSystem.Drawing;usingstaticiTextSharp.text.Font;usingSystem.Text;namespaceWebApi.Common.Service......
  • 初识 TShark
    TShark作为wireshark的命令行工具。TShark是一个网络协议分析器。可以进行实时网络捕获数据包数据,或从以前保存的捕获文档中读取数据包,将这些数据包的解码形式打印到标准输出或将数据包写入文档。TShark的原生捕获文档格式是pcapng格式,这也是Wireshark和其他各种工具使用的格式。......
  • 记录下常用的boxShadow样式
    预览图代码1.box-shadow#0csscode====>box-shadow:rgba(149,157,165,0.2)0px8px24px;2.box-shadow#1csscode====>box-shadow:rgba(100,100,111,0.2)0px7px29px0px;3.box-shadow#2csscode====>box-shadow:rgba(0,0,0,0.15)1.95......