解決go獲取文件md5值不正確的問題
一次偶然的操作,發(fā)現(xiàn)了一些端倪,獲取md5時如下是常規(guī)操作:
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就是我們想要的。但是再看如下這種情況:
// 創(chuàng)建目標(biāo)文件,其它兩個文件將合并到此文件 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應(yīng)該就是我們想要的結(jié)果了,基于dstFile對象獲取md5 // 此位置標(biāo)記為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對比,結(jié)果發(fā)現(xiàn)不相等。。。
等如上流程執(zhí)行完,發(fā)現(xiàn)兩個md5不相等,但文件實(shí)際上完全一樣,合并一切正常,那問題出在了哪里?
就是出在最后計算md5值上,在執(zhí)行兩次io.Copy后,我們需要的全部內(nèi)容已經(jīng)全部到了dstFile文件里,但此時要注意的是,經(jīng)過兩次io.Copy,dstFile對象已指向文件末尾,此時去拿md5拿到的結(jié)果相當(dāng)于是基于空內(nèi)容計算的(需要從開始位置計算md5),必然不正確,此時應(yīng)當(dāng)在x位置重置偏移量為開始位置,即:
file.Seek(0, 0)
即可成功! 快去試試吧!
到此這篇關(guān)于解決go獲取文件md5值不正確的問題的文章就介紹到這了,更多相關(guān)go獲取文件md5值內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語言中使用flag包對命令行進(jìn)行參數(shù)解析的方法
這篇文章主要介紹了Go語言中使用flag包對命令行進(jìn)行參數(shù)解析的方法,文中舉了一個實(shí)現(xiàn)flag.Value接口來自定義flag的例子,需要的朋友可以參考下2016-04-04獲取Golang環(huán)境變量的三種方式小結(jié)
本文介紹了Golang中獲取環(huán)境變量的三種方式,包含使用Viper包、GoDotEnv包和os包,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-11-11Go+Vue開發(fā)一個線上外賣應(yīng)用的流程(用戶名密碼和圖形驗(yàn)證碼)
這篇文章主要介紹了Go+Vue開發(fā)一個線上外賣應(yīng)用(用戶名密碼和圖形驗(yàn)證碼),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11Goland配置leetcode的實(shí)現(xiàn)示例
本文主要介紹了Goland配置leetcode的實(shí)現(xiàn)示例,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-06-06解決Golang time.Parse和time.Format的時區(qū)問題
這篇文章主要介紹了解決Golang time.Parse和time.Format的時區(qū)問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04