package utils import ( "fmt" "github.com/davecgh/go-spew/spew" "hash" "hash/fnv" "k8s.io/apimachinery/pkg/util/rand" ) // ComputeHash computes hash value of a interface func ComputeHash(obj interface{}) string { hasher := fnv.New32a() deepHashObject(hasher, obj) return rand.SafeEncodeString(fmt.Sprint(hasher.Sum32())) } // deepHashObject writes specified object to hash using the spew library // which follows pointers and prints actual values of the nested objects // ensuring the hash does not change when a pointer changes. // **Notice** // we don't want to import k8s.io/kubernetes as a module, but this is a very small function // so just copy it from k8s.io/kubernetes@v1.14.0/pkg/util/hash/hash.go // **Notice End** func deepHashObject(hasher hash.Hash, objectToWrite interface{}) { hasher.Reset() printer := spew.ConfigState{ Indent: " ", SortKeys: true, DisableMethods: true, SpewKeys: true, } printer.Fprintf(hasher, "%#v", objectToWrite) }