github.com/karalabe/go-ethereum@v0.8.5/Godeps/_workspace/src/code.google.com/p/go-uuid/uuid/version1.go (about)

     1  // Copyright 2011 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.
    17  func NewUUID() UUID {
    18  	if nodeID == nil {
    19  		SetNodeInterface("")
    20  	}
    21  
    22  	now, err := GetTime()
    23  	if err != nil {
    24  		return nil
    25  	}
    26  
    27  	uuid := make([]byte, 16)
    28  
    29  	time_low := uint32(now & 0xffffffff)
    30  	time_mid := uint16((now >> 32) & 0xffff)
    31  	time_hi := uint16((now >> 48) & 0x0fff)
    32  	time_hi |= 0x1000 // Version 1
    33  
    34  	binary.BigEndian.PutUint32(uuid[0:], time_low)
    35  	binary.BigEndian.PutUint16(uuid[4:], time_mid)
    36  	binary.BigEndian.PutUint16(uuid[6:], time_hi)
    37  	binary.BigEndian.PutUint16(uuid[8:], clock_seq)
    38  	copy(uuid[10:], nodeID)
    39  
    40  	return uuid
    41  }