解決go獲取文件md5值不正確的問(wèn)題
一次偶然的操作,發(fā)現(xiàn)了一些端倪,獲取md5時(shí)如下是常規(guī)操作:
md5hash := md5.New() file, _ := os.Open(filename) defer file.Close() _, err := io.Copy(md5hash, file) // file 為*os.File類(lèi)型,即讀取文件后的文件對(duì)象 if err != nil { return err } md5Str := fmt.Sprintf("%x", md5hash.Sum(nil))
正常情況下,md5Str就是我們想要的。但是再看如下這種情況:
// 創(chuàng)建目標(biāo)文件,其它兩個(gè)文件將合并到此文件 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() // 暫時(shí)去掉錯(cuò)誤處理 io.Copy(dstFile, srcFile1) io.Copy(dstFile, srcFile2) // 此時(shí)按理說(shuō)dstFile應(yīng)該就是我們想要的結(jié)果了,基于dstFile對(duì)象獲取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
接下來(lái)是md5對(duì)比流程,將源文件md5和dstFile的md5對(duì)比,結(jié)果發(fā)現(xiàn)不相等。。。
等如上流程執(zhí)行完,發(fā)現(xiàn)兩個(gè)md5不相等,但文件實(shí)際上完全一樣,合并一切正常,那問(wèn)題出在了哪里?
就是出在最后計(jì)算md5值上,在執(zhí)行兩次io.Copy后,我們需要的全部?jī)?nèi)容已經(jīng)全部到了dstFile文件里,但此時(shí)要注意的是,經(jīng)過(guò)兩次io.Copy,dstFile對(duì)象已指向文件末尾,此時(shí)去拿md5拿到的結(jié)果相當(dāng)于是基于空內(nèi)容計(jì)算的(需要從開(kāi)始位置計(jì)算md5),必然不正確,此時(shí)應(yīng)當(dāng)在x位置重置偏移量為開(kāi)始位置,即:
file.Seek(0, 0)
即可成功! 快去試試吧!
到此這篇關(guān)于解決go獲取文件md5值不正確的問(wèn)題的文章就介紹到這了,更多相關(guān)go獲取文件md5值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
go?mod文件內(nèi)容版本號(hào)簡(jiǎn)單用法詳解
這篇文章主要為大家介紹了go?mod文件內(nèi)容版本號(hào)簡(jiǎn)單用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10Go語(yǔ)言中使用flag包對(duì)命令行進(jìn)行參數(shù)解析的方法
這篇文章主要介紹了Go語(yǔ)言中使用flag包對(duì)命令行進(jìn)行參數(shù)解析的方法,文中舉了一個(gè)實(shí)現(xiàn)flag.Value接口來(lái)自定義flag的例子,需要的朋友可以參考下2016-04-04獲取Golang環(huán)境變量的三種方式小結(jié)
本文介紹了Golang中獲取環(huán)境變量的三種方式,包含使用Viper包、GoDotEnv包和os包,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-11-11一文帶你感受Go語(yǔ)言空結(jié)構(gòu)體的魔力
在?Go?語(yǔ)言中,有一種特殊的用法可能讓許多人感到困惑,那就是空結(jié)構(gòu)體,本文將對(duì)Go空結(jié)構(gòu)體進(jìn)行詳解,準(zhǔn)備一杯你最喜歡的飲料或茶,隨著本文一探究竟吧2023-05-05Go+Vue開(kāi)發(fā)一個(gè)線上外賣(mài)應(yīng)用的流程(用戶名密碼和圖形驗(yàn)證碼)
這篇文章主要介紹了Go+Vue開(kāi)發(fā)一個(gè)線上外賣(mài)應(yīng)用(用戶名密碼和圖形驗(yàn)證碼),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11Goland配置leetcode的實(shí)現(xiàn)示例
本文主要介紹了Goland配置leetcode的實(shí)現(xiàn)示例,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-06-06簡(jiǎn)單聊一聊Go語(yǔ)言中的數(shù)組和切片
數(shù)組和切片由于語(yǔ)法十分相似,在使用中容易混淆,要認(rèn)真區(qū)分,下面這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言中數(shù)組和切片的相關(guān)資料,需要的朋友可以參考下2021-07-07解決Golang time.Parse和time.Format的時(shí)區(qū)問(wèn)題
這篇文章主要介紹了解決Golang time.Parse和time.Format的時(shí)區(qū)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04