package cluster import "github.com/dchest/siphash" // computes the target member using siphash and returns the index and the member // siphash was chosen to prevent against hash attacks where an attacker // can target all requests to one given instance instead of balancing across the cluster // resulting in a Denial-of-Service (DOS). // ref: https://en.wikipedia.org/wiki/SipHash func ComputeTargetMember(hashKey string, members []string, repoName string) (uint64, string) { h := siphash.New([]byte(hashKey)) h.Write([]byte(repoName)) sum64 := h.Sum64() targetIdx := sum64 % uint64(len(members)) return targetIdx, members[targetIdx] }