为了账号安全,请及时绑定邮箱和手机立即绑定

为什么通过TeeReader的tar.gz的tar-部分的md5哈希错误?

为什么通过TeeReader的tar.gz的tar-部分的md5哈希错误?

Go
萧十郎 2021-05-27 18:10:42
我只是在尝试使用archive / tar和compress / gzip来自动处理某些备份。我的问题由此而来:我有各种各样的.tar文件和.tar.gz文件浮动,因此我想提取.tar.gz文件的哈希(md5)和.tar文件的哈希(md5)同样,理想的是一次运行。到目前为止,我拥有的示例代码对于.tar.gz和.gz文件中的哈希值都可以很好地工作,但是.tar的哈希值是错误的,我无法找出问题所在。我查看了 tar/reader.go 文件,我看到那里有一些跳过,但我认为一切都应该在 io.Reader 接口上运行,因此 TeeReader 仍应捕获所有字节。package mainimport (    "archive/tar"    "compress/gzip"    "crypto/md5"    "fmt"    "io"    "os")func main() {    tgz, _ := os.Open("tb.tar.gz")    gzMd5 := md5.New()    gz, _ := gzip.NewReader(io.TeeReader(tgz, gzMd5))    tarMd5 := md5.New()    tr := tar.NewReader(io.TeeReader(gz, tarMd5))    for {        fileMd5 := md5.New()        hdr, err := tr.Next()        if err == io.EOF {            break        }        io.Copy(fileMd5, tr)        fmt.Printf("%x  %s\n", fileMd5.Sum(nil), hdr.Name)    }    fmt.Printf("%x  tb.tar\n", tarMd5.Sum(nil))    fmt.Printf("%x  tb.tar.gz\n", gzMd5.Sum(nil))}现在来看下面的例子:$ echo "a" > a.txt$ echo "b" > b.txt$ tar cf tb.tar a.txt b.txt $ gzip -c tb.tar > tb.tar.gz$ md5sum a.txt b.txt tb.tar tb.tar.gz60b725f10c9c85c70d97880dfe8191b3  a.txt3b5d5c3712955042212316173ccf37be  b.txt501352dcd8fbd0b8e3e887f7dafd9392  tb.tar90d6ba204493d8e54d3b3b155bb7f370  tb.tar.gz在Linux Mint 14(基于Ubuntu 12.04)和来自Ubuntu存储库的go 1.02上,我的go程序的结果是:$ go run tarmd5.go 60b725f10c9c85c70d97880dfe8191b3  a.txt3b5d5c3712955042212316173ccf37be  b.txta26ddab1c324780ccb5199ef4dc38691  tb.tar90d6ba204493d8e54d3b3b155bb7f370  tb.tar.gz因此,除tb.tar之外的所有哈希均符合预期。(当然,如果您重试该示例,由于时间戳不同,您的.tar和.tar.gz将与此不同)任何有关如何使其工作的提示将不胜感激,但我确实更希望一次运行(与TeeReaders一起使用)。
查看完整描述

1 回答

  • 1 回答
  • 0 关注
  • 301 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信