diff --git a/uuid/uuid.go b/uuid/uuid.go index 439e0dc4a32..a5ff9e2dd13 100644 --- a/uuid/uuid.go +++ b/uuid/uuid.go @@ -37,15 +37,35 @@ package uuid // import "github.com/influxdata/influxdb/uuid" import ( "sync/atomic" "time" + "net" + "crypto/rand" ) // UUID - unique identifier type representing a 128 bit number type UUID [16]byte var timeBase = time.Date(1582, time.October, 15, 0, 0, 0, 0, time.UTC).Unix() -var hardwareAddr []byte +var hardwareAddr [6]byte = hwAddrFunc() var clockSeq uint32 +func hwAddrFunc() [6]byte { + u := [6]byte{} + + ifaces, err := net.Interfaces() + if err != nil { + rand.Reader.Read(u[:]) + return u + } + for _, iface := range ifaces { + if len(iface.HardwareAddr) >= 6 { + copy(u[:], iface.HardwareAddr) + return u + } + } + rand.Reader.Read(u[:]) + return u +} + // TimeUUID generates a new time based UUID (version 1) using the current // time as the timestamp. func TimeUUID() UUID { @@ -68,7 +88,7 @@ func FromTime(aTime time.Time) UUID { u[8] = byte(clock >> 8) u[9] = byte(clock) - copy(u[10:], hardwareAddr) + copy(u[10:], hardwareAddr[:]) u[6] |= 0x10 // set version to 1 (time based uuid) u[8] &= 0x3F // clear variant