github.com/foo/bar v0.0.0-20231129062549-b7ab892f9094 h1:mLLR/caPeDkssu3k//uDZs9mh3SDpgPvecIqilAQgss=
github.com/foo/bar v0.0.0-20231129062549-b7ab892f9094/go.mod h1:UZLHFxCzQiKhdNMV45+uMSq4pDYoiEycD23VZdOo4aw=
我正在尝试手动生成值
h1:mLLR/caPeDkssu3k//uDZs9mh3SDpgPvecIqilAQgss=
和 h1:UZLHFxCzQiKhdNMV45+uMSq4pDYoiEycD23VZdOo4aw=
但到目前为止未能做到。
第一次尝试:
find ~/go/pkg/mod/github.com/foo/[email protected]/ -type f -exec cat {} + | sha256sum
864c5090b6443e61a7ff1c84c2e5aed65d7d2d6bece73fdec836a864507c8bb9
第二次尝试:
func testMD5() {
f, err := os.Open("/Users/xxx/go/pkg/mod/github.com/foo/[email protected]/puppy.go")
if err != nil {
log.Fatal(err)
}
defer f.Close()
h := sha256.New()
if _, err := io.Copy(h, f); err != nil {
log.Fatal(err)
}
fmt.Printf("%x", h.Sum(nil))
}
6ed0f6e4e9a60ab1e9331b8c2baa434c00661df0fa4ac2e487a2052b5cc9ff76
我的目的是了解对应的哈希值是什么,如果它仅基于文件的内容,则应该有一种方法可以手动生成它们以产生完全相同的值
直到昨天我才知道,但我花了一些时间来了解如何计算 go 模块的校验和。
感谢@JimB 在与
go.mod
文件的聊天中提供了很多帮助。我从中获得了灵感并找到了如何计算模块的 checksums
。
我发现它的工作方式是::
fmt.Fprintf(h, "%x %s\n", hf.Sum(nil), file)
。它取自这里sha256sum
hex
将上面的 xxd
输出转换为二进制模式(在 *unix 系统上,如果以编程方式执行,base64
可以直接从 byte array
进行编码)base64
checksum
文件中的 go.sum
进行比较对于
go.mod
文件,使用以下 bash
命令计算相对容易::
harsha$ sha256sum $(find go.mod -type f | sort) | sha256sum | xxd -r -p | base64
oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
这与使用
checksum
模块 go.sum
版本在 golang.org/x/sys
文件中定义的 v0.12.0
匹配。
唯一需要注意的是
go.mod
的路径不应该通过,因为它也会影响sha256sum
。
对于
module
目录验证,除了 file
名称之外,过程几乎相同,因为 go
验证它与 go.mod
相比有点不同。从here开始,计算目录的hash
,后跟模块路径的前缀,如mod.Path+"@"+mod.Version
,它转换为golang.org/x/[email protected]
模块的sys
。
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=
这里的
sed
将filepath
从绝对路径/Users/hmusanalli/go/pkg/mod/golang.org/x/[email protected]
修剪为golang.org/x/[email protected]
(mod路径)
我也可以通过定位
golang
函数这里来验证与
HashDir
相同的情况
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)
}
}
Go Documentation here 非常清楚,除了如何找到
prefix
来计算 HashDir