diff --git a/client/client.go b/client/client.go index 9894dd48236..7183c939f1d 100644 --- a/client/client.go +++ b/client/client.go @@ -655,9 +655,13 @@ func (c *Client) getAllocRunners() map[string]*AllocRunner { func (c *Client) nodeID() (id, secret string, err error) { var hostID string hostInfo, err := host.Info() - if !c.config.NoHostUUID && err == nil && helper.IsUUID(hostInfo.HostID) { - hostID = hostInfo.HostID - } else { + if !c.config.NoHostUUID && err == nil { + if hashed, ok := helper.HashUUID(hostInfo.HostID); ok { + hostID = hashed + } + } + + if hostID == "" { // Generate a random hostID if no constant ID is available on // this platform. hostID = structs.GenerateUUID() diff --git a/helper/funcs.go b/helper/funcs.go index 8c62e06f2a6..44a3e57c4dd 100644 --- a/helper/funcs.go +++ b/helper/funcs.go @@ -1,6 +1,8 @@ package helper import ( + "crypto/sha512" + "fmt" "regexp" "time" ) @@ -18,6 +20,25 @@ func IsUUID(str string) bool { return validUUID.MatchString(str) } +// HashUUID takes an input UUID and returns a hashed version of the UUID to +// ensure it is well distributed. +func HashUUID(input string) (output string, hashed bool) { + if !IsUUID(input) { + return "", false + } + + // Hash the input + buf := sha512.Sum512([]byte(input)) + output = fmt.Sprintf("%08x-%04x-%04x-%04x-%12x", + buf[0:4], + buf[4:6], + buf[6:8], + buf[8:10], + buf[10:16]) + + return output, true +} + // boolToPtr returns the pointer to a boolean func BoolToPtr(b bool) *bool { return &b