解决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)
即可成功! 快去试试吧!
到此这篇关于解决go获取文件md5值不正确的问题的文章就介绍到这了,更多相关go获取文件md5值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Go语言中比较两个map[string]interface{}是否相等
本文主要介绍了Go语言中比较两个map[string]interface{}是否相等,我们可以将其转化成顺序一样的 slice ,然后再转化未json,具有一定的参考价值,感兴趣的可以了解一下2023-08-08Go语言常见错误之滥用getters/setters误区实例探究
在Go语言编程中,恰如其分地使用getters和setters是至关重要的,过度和不适当地使用它们可能导致代码冗余、可读性差和封装不当,在本文中,我们将深入探讨如何识别滥用getter和setter的情况,以及如何采取最佳实践来避免这些常见的Go错误2024-01-01
最新评论