package pool import ( "crypto/sha256" "fmt" "sort" "strings" "github.com/indifferentketchup/llama-sidecar/internal/validator" ) // Hash computes a deterministic hash for a (modelID, flags) pair. // Flag order does not affect the result. func Hash(modelID string, flags []string) string { type pair struct { key, val string } var pairs []pair i := 0 for i < len(flags) { tok := flags[i] key := validator.FlagName(tok) if key == "" { i++ continue } if idx := strings.IndexByte(tok, '='); idx >= 0 { pairs = append(pairs, pair{key: tok[:idx], val: tok[idx+1:]}) i++ } else if i+1 < len(flags) && validator.FlagName(flags[i+1]) == "" { pairs = append(pairs, pair{key: key, val: flags[i+1]}) i += 2 } else { pairs = append(pairs, pair{key: key, val: ""}) i++ } } sort.Slice(pairs, func(a, b int) bool { return pairs[a].key < pairs[b].key }) var parts []string for _, p := range pairs { parts = append(parts, p.key+"\x1f"+p.val) } serialized := strings.Join(parts, "\x1e") input := modelID + "\x1d" + serialized sum := sha256.Sum256([]byte(input)) return fmt.Sprintf("%x", sum[:8]) }