44 lines
829 B
Go
44 lines
829 B
Go
package control
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"encoding/hex"
|
|
"sort"
|
|
|
|
"lukechampine.com/blake3"
|
|
)
|
|
|
|
func StreamFingerprint(templateFP, outPort string, inMap map[string]string) string {
|
|
// Sort input keys for determinism.
|
|
keys := make([]string, 0, len(inMap))
|
|
for k := range inMap {
|
|
keys = append(keys, k)
|
|
}
|
|
sort.Strings(keys)
|
|
|
|
h := blake3.New(32, nil)
|
|
|
|
write := func(s string) {
|
|
var lenbuf [4]byte
|
|
binary.LittleEndian.PutUint32(lenbuf[:], uint32(len(s)))
|
|
_, _ = h.Write(lenbuf[:])
|
|
_, _ = h.Write([]byte(s))
|
|
}
|
|
|
|
// templateFP, outPort, input count, then pairs.
|
|
write(templateFP)
|
|
write(outPort)
|
|
|
|
var nbuf [4]byte
|
|
binary.LittleEndian.PutUint32(nbuf[:], uint32(len(keys)))
|
|
_, _ = h.Write(nbuf[:])
|
|
|
|
for _, k := range keys {
|
|
write(k)
|
|
write(inMap[k])
|
|
}
|
|
|
|
sum := h.Sum(nil)
|
|
return hex.EncodeToString(sum)
|
|
}
|