当前位置: 首页 > news >正文

go获取文件md5值不正确的问题记录

一次偶然的操作,发现了一些端倪,获取md5时如下是常规操作:

    md5hash := md5.New()
    
    file, _ := os.Open(filename)
    defer file.Close()
    
    _, err := io.Copy(md5hash, file)  // file 为*os.File类型,即读取文件后的文件对象
    if err != nil {
        return err
    }

    md5Str := fmt.Sprintf("%x", md5hash.Sum(nil))

正常情况下,md5Str就是我们想要的。但是再看如下这种情况:

    // 创建目标文件,其它两个文件将合并到此文件
        dstFile, err := os.Create("path")
        if err != nil {
            return
        }
        defer dstFile.Close()

        srcFile1, openErr := os.Open(filePath)
        if openErr != nil {
            return
        }
        defer srcFile1.Close()
        
        srcFile2, openErr := os.Open(filePath)
        if openErr != nil {
            return
        }
        defer srcFile2.Close()

        // 暂时去掉错误处理
        io.Copy(dstFile, srcFile1)
        io.Copy(dstFile, srcFile2)
        
        // 此时按理说dstFile应该就是我们想要的结果了,基于dstFile对象获取md5
        // 此位置标记为x
        
        md5hash := md5.New()
        totalSize, err := io.Copy(md5hash, dstFile)  
        if err != nil {
            return err
        }

        md5Str := fmt.Sprintf("%x", md5hash.Sum(nil))  // 拿到的md5Str

接下来是md5对比流程,将源文件md5和dstFile的md5对比,结果发现不相等。。。

等如上流程执行完,发现两个md5不相等,但文件实际上完全一样,合并一切正常,那问题出在了哪里?

就是出在最后计算md5值上,在执行两次io.Copy后,我们需要的全部内容已经全部到了dstFile文件里,但此时要注意的是,经过两次io.Copy,dstFile对象已指向文件末尾,此时去拿md5拿到的结果相当于是基于空内容计算的(需要从开始位置计算md5),必然不正确,此时应当在x位置重置偏移量为开始位置,即:

  file.Seek(0, 0)

即可成功! 快去试试吧!
 

相关文章:

  • 基于springboot+vue的图书个性化推荐系统(前后端分离)
  • 爬虫入门学习(二)——response对象
  • 【51单片机Keil+Proteus8.9】控制步进电机+LCD1602显示状态
  • Kafka框架详解
  • Hive数据定义(1)
  • C#学习教程
  • 【论文阅读】Relation-Aware Graph Transformer for SQL-to-Text Generation
  • java数据结构与算法刷题-----LeetCode59. 螺旋矩阵 II
  • 【02】mapbox js api加载arcgis切片服务
  • Python数据分析案例33——新闻文本主题多分类(Transformer, 组合模型) 模型保存
  • 如何避免知识付费小程序平台的陷阱?搭建平台的最佳实践
  • Webpack5入门到原理12:处理 Html 资源
  • linux上面hadoop配置集群
  • 现阶段Python和Java哪个更吃香?
  • Ubuntu使用QtCreator + CMake 开发C/C++程序
  • 克魔助手工具详解、数据包抓取分析、使用教程
  • 【备战蓝桥杯】图的遍历问题
  • C++后端笔记
  • MetaGPT-打卡-day2,MetaGPT框架组件学习
  • CSS 浮动 定位
  • 陕西旱情实探:大型灌区农业供水有保障,大旱之年无旱象
  • 视频|王弘治:王太后,“先天宫斗圣体”?
  • 科普|“小”耳洞也会引发“大”疙瘩,如何治疗和预防?
  • 2025年度十大IP!IP SH荣膺文化综合类TOP10
  • 韩国总统大选候选人登记结束,共7人参选
  • 游戏论|暴君无道,吊民伐罪——《苏丹的游戏》中的政治