fix: make resource fingerprints deterministic

Sort map keys before hashing so Resource.ID is stable.
This commit is contained in:
krau
2026-08-16 20:27:42 +08:00
parent 9ed5b5f962
commit b6e981282d

View File

@@ -4,6 +4,8 @@ import (
"context" "context"
"crypto/md5" "crypto/md5"
"fmt" "fmt"
"maps"
"slices"
) )
type Parser interface { type Parser interface {
@@ -57,14 +59,15 @@ func (r *Resource) ID() string {
h.Write([]byte(r.Extension)) h.Write([]byte(r.Extension))
fmt.Fprintf(h, "%d", r.Size) fmt.Fprintf(h, "%d", r.Size)
for k, v := range r.Hash { // Map iteration order is random: sort keys so the fingerprint is stable.
for _, k := range slices.Sorted(maps.Keys(r.Hash)) {
h.Write([]byte(k)) h.Write([]byte(k))
h.Write([]byte(v)) h.Write([]byte(r.Hash[k]))
} }
for k, v := range r.Headers { for _, k := range slices.Sorted(maps.Keys(r.Headers)) {
h.Write([]byte(k)) h.Write([]byte(k))
h.Write([]byte(v)) h.Write([]byte(r.Headers[k]))
} }
return fmt.Sprintf("%x", h.Sum(nil)) return fmt.Sprintf("%x", h.Sum(nil))