checksum.go 990 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package checksum
  2. import (
  3. "crypto/sha256"
  4. "encoding/hex"
  5. "path"
  6. "slices"
  7. "github.com/langgenius/dify-plugin-daemon/internal/core/plugin_packager/decoder"
  8. )
  9. func CalculateChecksum(plugin decoder.PluginDecoder) (string, error) {
  10. m := map[string][]byte{}
  11. sha256 := func(data []byte) []byte {
  12. sha := sha256.New()
  13. sha.Write(data)
  14. return sha.Sum(nil)
  15. }
  16. if err := plugin.Walk(func(filename string, dir string) error {
  17. var err error
  18. content, err := plugin.ReadFile(path.Join(dir, filename))
  19. if err != nil {
  20. return err
  21. }
  22. m[path.Join(dir, filename)] = sha256(content)
  23. return nil
  24. }); err != nil {
  25. return "", err
  26. }
  27. // sort the keys, ensure the order is consistent
  28. keys := make([]string, 0, len(m))
  29. for k := range m {
  30. keys = append(keys, k)
  31. }
  32. slices.Sort(keys)
  33. data := make([]byte, 0, len(m)*(32+32))
  34. for _, k := range keys {
  35. data = append(data, sha256([]byte(k))...)
  36. data = append(data, m[k]...)
  37. }
  38. return hex.EncodeToString(sha256(data)), nil
  39. }