Open1

Go で SHA512 を扱う

Shunsuke SuzukiShunsuke Suzuki

checksum の検証で SHA512 に対応しないといけない
https://github.com/aquaproj/aqua/issues/427#issuecomment-1207337507

https://pkg.go.dev/crypto/sha512#Sum512

https://pkg.go.dev/encoding/hex#example-EncodeToString

https://pkg.go.dev/fmt

%x base 16, lower-case, two characters per byte

string に変換するには fmt.Sprintf か、 hex.EncodeToString が使える。

ベンチマーク取ったら明らかに hex.EncodeToString のほうが良い

package bench

import (
	"crypto/sha512"
	"encoding/hex"
	"fmt"
	"os"
	"testing"
)

func Benchmark_Encode(b *testing.B) {
	byt, err := os.ReadFile("../asciigraph_0.5.5_Darwin_arm64.tar.gz")
	if err != nil {
		b.Fatal(err)
	}
	sum := sha512.Sum512(byt)
	b.Run("fmt", func(b *testing.B) {
		b.ResetTimer()
		for i := 0; i < b.N; i++ {
			_ = fmt.Sprintf("%x", sum)
		}
	})
	b.Run("hex", func(b *testing.B) {
		b.ResetTimer()
		for i := 0; i < b.N; i++ {
			_ = hex.EncodeToString(sum[:])
		}
	})
}
$ go test -bench . -benchmem
goos: darwin
goarch: arm64
pkg: foo
Benchmark_Encode/fmt-8         	 3513541	       316.6 ns/op	     256 B/op	       3 allocs/op
Benchmark_Encode/hex-8         	14288577	        82.02 ns/op	     256 B/op	       2 allocs/op
PASS
ok  	foo	3.040s