gpt4 book ai didi

go - 如何在Go中计算很大文件的SHA256?

转载 作者:行者123 更新时间:2023-12-01 22:15:45 27 4
gpt4 key购买 nike

我有一个很大的文件,我需要计算Go中的校验和(介于30和200GB之间)。我使用了通用的sha256sum程序来获取数据的规范哈希值,但是在Go中尝试执行相同的操作时,却无法获得相同的哈希值。

我最初从此功能开始工作,该功能完全可以实现以下功能:

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
}

但是,需求发生了变化,读取缓冲区时我需要对缓冲区进行一些处理,因此我将代码修改为如下所示。但是,现在哈希是不正确的,并且我不确定自己在做什么错。

    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)))

有人知道我在做什么错吗?

最佳答案

我想到了。我需要在写之前截断缓冲区:
h.Write(buf[:bytesRead])代替h.Write(buf)

关于go - 如何在Go中计算很大文件的SHA256?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60328216/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com