[822] | 1 | // Copyright 2016 Google Inc. All rights reserved.
|
---|
| 2 | // Use of this source code is governed by a BSD-style
|
---|
| 3 | // license that can be found in the LICENSE file.
|
---|
| 4 |
|
---|
| 5 | package uuid
|
---|
| 6 |
|
---|
| 7 | import (
|
---|
| 8 | "encoding/binary"
|
---|
| 9 | )
|
---|
| 10 |
|
---|
| 11 | // NewUUID returns a Version 1 UUID based on the current NodeID and clock
|
---|
| 12 | // sequence, and the current time. If the NodeID has not been set by SetNodeID
|
---|
| 13 | // or SetNodeInterface then it will be set automatically. If the NodeID cannot
|
---|
| 14 | // be set NewUUID returns nil. If clock sequence has not been set by
|
---|
| 15 | // SetClockSequence then it will be set automatically. If GetTime fails to
|
---|
| 16 | // return the current NewUUID returns nil and an error.
|
---|
| 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 | }
|
---|