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"
"crypto/md5"
"fmt"
"maps"
"slices"
)
type Parser interface {
@@ -57,14 +59,15 @@ func (r *Resource) ID() string {
h.Write([]byte(r.Extension))
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(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(v))
h.Write([]byte(r.Headers[k]))
}
return fmt.Sprintf("%x", h.Sum(nil))