go.sum中的校验和是如何计算的?

rlcwz9us  于 11个月前  发布在  Go
关注(0)|答案(2)|浏览(125)

我查看了https://go.dev/doc/modules/gomod-ref和https://go.dev/ref/mod#go-mod-tidy,在这两页上都找不到任何解释go.sum中校验和是如何计算的文档。
go.sum中的校验和是如何计算的?

qojgxg4l

qojgxg4l1#

校验和是依赖项的散列。您要查找的文档是https://go.dev/ref/mod#go-sum-files。
sum中的每一行都有三个由空格分隔的字段:模块路径、版本(可能以/go.mod结尾)和哈希。

  • 模块路径是散列所属的模块的名称。
  • 版本是散列所属模块的版本。如果版本以/go.mod结尾,则散列仅用于模块的go.mod文件;否则,散列用于模块的.zip文件中的文件。
  • 哈希列由算法名称(如h1)和base64编码的加密哈希组成,由冒号(:)分隔。目前,SHA-256(h1)是唯一支持的哈希算法。如果将来发现SHA-256中的漏洞,将添加对另一种算法(名为h2等)的支持。

示例go.sum line与module version hash类似

github.com/go-chi/chi v1.5.4 h1:QHdzF2szwjqVV4wmByUnTcsbIg7UGaQ0tPF2t5GcAIs=
github.com/go-chi/chi v1.5.4/go.mod h1:uaf8YgoFazUOkPBG7fxPftUylNumIev9awIWOENIuEg=

字符串

nkhmeac6

nkhmeac62#

如果你有兴趣手动计算/验证checksums,你可以检查我的答案here
bash通过传递cacheprefix下载的模块:

harsha $ sha256sum $(find /Users/hmusanalli/go/pkg/mod/golang.org/x/[email protected] -type f | sort ) | sed 's#/Users/hmusanalli/go/pkg/mod/##' | sha256sum | xxd -r -p | base64       
 CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o=

字符串
go使用内置的HashDir函数定义here

func TestHashDir2(t *testing.T) {
  out, err := HashDir("/Users/hmusanalli/go/pkg/mod/golang.org/x/[email protected]", "golang.org/x/[email protected]", Hash1)
  if err != nil {
    t.Fatalf("HashDir: %v", err)
  }

  want := "h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o="
  if out != want {
    t.Errorf("HashDir(...) = %s, want %s", out, want)
  }
}

相关问题