blob: 463109629eee180e87507373a3e957e72c34f179 [file] [log] [blame]
divyadesai81bb7ba2020-03-11 11:45:23 +00001// 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
5package uuid
6
7import (
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.
19func NewUUID() (UUID, error) {
divyadesai81bb7ba2020-03-11 11:45:23 +000020 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)
David K. Bainbridgee05cf0c2021-08-19 03:16:50 +000035
36 nodeMu.Lock()
37 if nodeID == zeroID {
38 setNodeInterface("")
39 }
divyadesai81bb7ba2020-03-11 11:45:23 +000040 copy(uuid[10:], nodeID[:])
David K. Bainbridgee05cf0c2021-08-19 03:16:50 +000041 nodeMu.Unlock()
divyadesai81bb7ba2020-03-11 11:45:23 +000042
43 return uuid, nil
44}