git.sr.ht/~pingoo/stdx@v0.0.0-20240218134121-094174641f6e/uuid/v1.go (about) 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 }