Files
2025-02-06 18:16:49 +08:00

46 lines
898 B
Go

package decoder
import (
"crypto/sha256"
"encoding/hex"
"path"
"slices"
)
func CalculateChecksum(plugin PluginDecoder) (string, error) {
m := map[string][]byte{}
sha256 := func(data []byte) []byte {
sha := sha256.New()
sha.Write(data)
return sha.Sum(nil)
}
if err := plugin.Walk(func(filename string, dir string) error {
var err error
content, err := plugin.ReadFile(path.Join(dir, filename))
if err != nil {
return err
}
m[path.Join(dir, filename)] = sha256(content)
return nil
}); err != nil {
return "", err
}
// sort the keys, ensure the order is consistent
keys := make([]string, 0, len(m))
for k := range m {
keys = append(keys, k)
}
slices.Sort(keys)
data := make([]byte, 0, len(m)*(32+32))
for _, k := range keys {
data = append(data, sha256([]byte(k))...)
data = append(data, m[k]...)
}
return hex.EncodeToString(sha256(data)), nil
}