解決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類型,即讀取文件后的文件對(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)文章
GoFrame框架Scan類型轉(zhuǎn)換實(shí)例
這篇文章主要為大家介紹了GoFrame框架Scan類型轉(zhuǎn)換的實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
Go語(yǔ)言定時(shí)任務(wù)的實(shí)現(xiàn)示例
本文主要介紹了Go語(yǔ)言定時(shí)任務(wù)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05
Golang 端口復(fù)用測(cè)試的實(shí)現(xiàn)
這篇文章主要介紹了Golang 端口復(fù)用測(cè)試的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03

