NewUUID returns a Version 1 UUID based on the current NodeID and clock sequence, and the current time. If the NodeID has not been set by SetNodeID or SetNodeInterface then it will be set automatically. If the NodeID cannot be set NewUUID returns nil. If clock sequence has not been set by SetClock
()
| 17 | // |
| 18 | // In most cases, New should be used. |
| 19 | func NewUUID() (UUID, error) { |
| 20 | var uuid UUID |
| 21 | now, seq, err := GetTime() |
| 22 | if err != nil { |
| 23 | return uuid, err |
| 24 | } |
| 25 | |
| 26 | timeLow := uint32(now & 0xffffffff) |
| 27 | timeMid := uint16((now >> 32) & 0xffff) |
| 28 | timeHi := uint16((now >> 48) & 0x0fff) |
| 29 | timeHi |= 0x1000 // Version 1 |
| 30 | |
| 31 | binary.BigEndian.PutUint32(uuid[0:], timeLow) |
| 32 | binary.BigEndian.PutUint16(uuid[4:], timeMid) |
| 33 | binary.BigEndian.PutUint16(uuid[6:], timeHi) |
| 34 | binary.BigEndian.PutUint16(uuid[8:], seq) |
| 35 | |
| 36 | nodeMu.Lock() |
| 37 | if nodeID == zeroID { |
| 38 | setNodeInterface("") |
| 39 | } |
| 40 | copy(uuid[10:], nodeID[:]) |
| 41 | nodeMu.Unlock() |
| 42 | |
| 43 | return uuid, nil |
| 44 | } |