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 | }
|
---|