// Copyright 2022 The KubeSphere Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // package utils import ( "fmt" "hash" "hash/fnv" "github.com/davecgh/go-spew/spew" "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) }