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

这篇具有很好参考价值的文章主要介绍了大文件 MD5 SHA 校验时间优化之路。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近研发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 进行分片校验

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

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

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

得到了十来个片段文件

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

接下来写个校验方法,对其中的片段文件校验,比如分片后,删了这些片段文件在重新生成,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 压缩包,一共三个文件

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

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

结果没问题,毕竟是整个文件直接校验文章来源地址https://www.toymoban.com/news/detail-700495.html

到了这里,关于大文件 MD5 SHA 校验时间优化之路的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 获取安卓签名文件的MD5值与SHA1码

    目录 前言 一、用命令行的方式仅能获取SH1、SHA256 ​编辑 二、用gradle的方式可以获取MD5值 1.打开Android Studio,点击右边的Gradle 2.点击大象,输入查询签名信息的命令 总结 公司App项目要备案,要搜集MD5值与SHA1码,用了以前的命令行方式只获取到SHA1,奇怪,网上学习了下,原来

    2024年02月16日
    浏览(57)
  • openssl做文件处理(base64,MD5,sha256等)

    这次使用openssl,发现openssl不仅可以用来做加密和解密,实际上也可以用来做文件的处理,比如base64转码、解码,文件md5的计算等。实现这些,即可以从命令行去做,也可以通过代码去实现。 1. 命令行操作         1. base64转码、解码                转码:         

    2024年02月11日
    浏览(43)
  • 文件完整性校验之MD5校验

    文件完整性校验之MD5校验 在现代计算机系统中,文件安全和完整性保护是至关重要的。不仅是个人用户需要保护他们的数据免受恶意软件和黑客攻击,企业和机构也需要确保其敏感数据的完整性和机密性。 MD5校验是一种广泛使用的校验技术,可以帮助用户验证文件是否经过

    2024年02月06日
    浏览(53)
  • Linux文件MD5校验

    1. 进入操作系统Linux中的/root目录,找到test.txt文件,并使用md5sum工具来计算出该文件的md5值,并将计算该文件md5的命令的字符串作为flag进行提交;   Flag :md5sum test.txt   2. 进入操作系统Linux中的/root目录,找到test.txt文件,并使用md5sum校验工具来计算出该文件的md5值,并将计

    2024年02月08日
    浏览(54)
  • Java关于MD5文件校验

    JAVA中获取文件MD5值的四种方法其实都很类似,因为核心都是通过JAVA自带的MessageDigest类来实现。获取文件MD5值主要分为三个步骤,第一步获取文件的byte信息,第二步通过MessageDigest类进行MD5加密,第三步转换成16进制的MD5码值。 MD5讯息摘要演算法(英语:MD5 Message-Digest Algori

    2024年02月08日
    浏览(45)
  • 文件传输中的MD5校验技术

      1. 文件的MD5校验简介   文件的MD5校验是一种常用的文件完整性验证方法。MD5(Message Digest Algorithm 5)是一种广泛应用的哈希算法,它能够将任意长度的数据转换为固定长度的哈希值。在文件校验中,MD5算法通过计算文件的哈希值,将文件内容转化为唯一的128位(16字节)哈

    2024年01月22日
    浏览(46)
  • javaScript前端文件一致性校验-md5方法

     需求背景:在处理文件上传时使用了第三方平台存储,后端在下载时需要校验与文件与上传时是否一致,已校验文件是否丢失的问题。如我们公司业务场景使用了分段上传,分段上传如果没有校验合并后的文件是否完整,可能会存在部分数据丢失 处理文件的唯一性可以通过

    2024年04月24日
    浏览(37)
  • 文件MD5校验码的安全性及重要性

    文件MD5(Message Digest Algorithm 5)是一种常用的哈希算法,用于验证文件的完整性和安全性。本文将深入介绍文件MD5的原理、应用场景以及如何计算和验证MD5值,帮助读者更好地理解和应用这一重要工具。 MD5算法通过对文件进行哈希运算,生成一个128位的唯一标识,即MD5值。这

    2024年03月09日
    浏览(54)
  • 获得文件MD5——校验完整性 & window 和 Linux下操作

    1.Windows 10 自带了一个命令行程序 certutil可以 获取文件的 MD5 值; 2.Linux下md5sum命令获得文件MD5值; Windows 10 自带了一个命令行程序 certutil ,它是 Windows 10 证书服务的一部分,可以用来转储和显示证书颁发机构(CA)配置信息、配置证书服务、备份和还原CA组件以及验证证书、

    2024年02月03日
    浏览(55)
  • 网络文件传输防止篡改-校验工具(md5sum)的使用

    MD5报文摘要算法(Message-Digest Algorithm 5)常常被用来验证网络文件传输的完整性,防止文件被人篡改。此算法对任意长度的信息逐位进行计算,产生一个二进制长度为128位(十六进制长度就是32位)的“指纹”(或称“报文摘要”),不同的文件产生相同的报文摘要的可能性是

    2023年04月16日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包