// keyFunc returns the key of an object, which is used to look up in the cache for it's matching object. // Since we match objects by namespace and Labels/Selector, so if two objects have the same namespace and labels, // they will have the same key. func keyFunc(obj objectWithMeta) uint64 { hash := adler32.New() hashutil.DeepHashObject(hash, &equivalenceLabelObj{ namespace: obj.GetNamespace(), labels: obj.GetLabels(), }) return uint64(hash.Sum32()) }
func hashAddresses(addrs addressSet) string { // Flatten the list of addresses into a string so it can be used as a // map key. Unfortunately, DeepHashObject is implemented in terms of // spew, and spew does not handle non-primitive map keys well. So // first we collapse it into a slice, sort the slice, then hash that. slice := make([]addrReady, 0, len(addrs)) for k, ready := range addrs { slice = append(slice, addrReady{k, ready}) } sort.Sort(addrsReady(slice)) hasher := md5.New() hashutil.DeepHashObject(hasher, slice) return hex.EncodeToString(hasher.Sum(nil)[0:]) }
func GetPodTemplateSpecHash(template api.PodTemplateSpec) uint32 { podTemplateSpecHasher := adler32.New() hashutil.DeepHashObject(podTemplateSpecHasher, template) return podTemplateSpecHasher.Sum32() }
func hashObject(hasher hash.Hash, obj interface{}) []byte { hashutil.DeepHashObject(hasher, obj) return hasher.Sum(nil) }
// HashContainer returns the hash of the container. It is used to compare // the running container with its desired spec. func HashContainer(container *api.Container) uint64 { hash := adler32.New() hashutil.DeepHashObject(hash, *container) return uint64(hash.Sum32()) }