go - 如何在 Go 中计算一个非常大的文件的 SHA256?
问题描述
我有一个非常大的文件,我需要计算 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)
推荐阅读
- excel - 可用于调用工作簿插件的选项
- database - 在 mongodb 中查找重复的 url
- html - Eclipse 请求 node.js
- css - vs code 中的 live sass 编译器不会重新编译部分,只有 main.scss
- reactjs - 待办事项列表添加新项目按钮不添加任何内容
- html - 仅在 IE 中无法以展开模式打开图像
- css - 如何在不设置 div 宽度的情况下显示背景图像
- python - 如何训练反叛神经元?
- amazon-web-services - 将数据从 AWS S3 上传到 RDS MySQL
- python - 如何处理“Redis.exceptions.ConnectionError:连接有数据”