錯誤計算md5值
// 開啟合成檔案
complateFile, _ := os.Create("./test.zip")
defer complateFile.Close()
// 迴圈分片合成
for i := 0; i < 5; i++ {
// ... 省略中間步驟
complateFile.Write(fileBuffer)
}
// 計算分片md5進行比對
m5 := md5.New()
_, _ = io.Copy(m5, complateFile)
complateFileMd5 := hex.EncodeToString(m5.Sum(nil))
if complateFileMd5 != originalFileMd5{
fmt.Println("md5驗證失敗")
}
錯誤原因
在Go中,如果你在合併分片檔案的過程中直接使用*os.File(即file指標)來計算MD5,這通常會導致計算錯誤,原因在於檔案指標的位置。當你開啟一個檔案並開始讀取時,檔案指標預設位於檔案的開頭。如果你在合併過程中不重置檔案指標,每次讀取都會從上次停止的地方開始,而不是從頭開始,導致計算的MD5不正確。
解決方案
- 計算md5前重置檔案指標到檔案的開頭
complateFile.Seek(0,0)
- 合成檔案後重新開啟檔案進行md5值計算
func(){
complateFile, _ := os.Create("./test.zip")
defer complateFile.Close()
for i := 0; i < 5; i++ {
// ... 省略中間步驟
complateFile.Write(fileBuffer)
}
}()
// 驗證檔案的完整性
file, _ := os.Open("./test.zip")
m5 := md5.New()
_, _ = io.Copy(m5, file)
complateFileMd5 := hex.EncodeToString(m5.Sum(nil))
if complateFileMd5 != originalFileMd5{
fmt.Println("md5驗證失敗")
}