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  }