version1.go raw

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