У меня очень большой файл, для которого мне нужно вычислить контрольную сумму в Go (от 30 до 200 ГБ). Я использовал обычную sha256sum
программу для получения канонического ха sh данных, но при попытке сделать то же самое в Go я не смог получить тот же ха sh.
Я изначально начал с этой функции, которая работает точно так, как и предполагалось:
func checksum(file string) (string, error) {
f, err := os.Open(file)
if err != nil {
return "", err
}
defer func() {
_ = f.Close()
}()
copyBuf := make([]byte, 1024 * 1024)
h := sha256.New()
if _, err := io.CopyBuffer(h, f, copyBuf); err != nil {
return "", err
}
return hex.EncodeToString(h.Sum(nil)), nil
}
Однако требования изменились, и мне нужно выполнить некоторую обработку в буфере, когда он читается, поэтому я изменил код так, чтобы что-то вроде этого. Однако теперь ха sh неверен, и я не уверен, что делаю неправильно.
f, err := os.Open("<large file>")
if err != nil {
panic(err)
}
defer func() {
_ = f.Close()
}()
buf := make([]byte, 1024 * 1024)
h := sha256.New()
for {
bytesRead, err := f.Read(buf)
if err != nil {
if err != io.EOF {
panic(err)
}
fmt.Println("EOF")
break
}
// do some other work with buf before adding it to the hasher
// processBuffer(buf)
fmt.Printf("bytes read: %d\n", bytesRead)
h.Write(buf)
}
fmt.Printf("checksum: %s\n", hex.EncodeToString(h.Sum(nil)))
Кто-нибудь знает, что я делаю не так?