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 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) { 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} 45