github.com/wlattner/mlserver@v0.0.0-20141113171038-895f261d2bfd/Godeps/_workspace/src/code.google.com/p/go-uuid/uuid/uuid.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  	"bytes"
     9  	"crypto/rand"
    10  	"fmt"
    11  	"io"
    12  	"strings"
    13  )
    14  
    15  // A UUID is a 128 bit (16 byte) Universal Unique IDentifier as defined in RFC
    16  // 4122.
    17  type UUID []byte
    18  
    19  // A Version represents a UUIDs version.
    20  type Version byte
    21  
    22  // A Variant represents a UUIDs variant.
    23  type Variant byte
    24  
    25  // Constants returned by Variant.
    26  const (
    27  	Invalid   = Variant(iota) // Invalid UUID
    28  	RFC4122                   // The variant specified in RFC4122
    29  	Reserved                  // Reserved, NCS backward compatibility.
    30  	Microsoft                 // Reserved, Microsoft Corporation backward compatibility.
    31  	Future                    // Reserved for future definition.
    32  )
    33  
    34  var rander = rand.Reader // random function
    35  
    36  // New returns a new random (version 4) UUID as a string.  It is a convenience
    37  // function for NewRandom().String().
    38  func New() string {
    39  	return NewRandom().String()
    40  }
    41  
    42  // Parse decodes s into a UUID or returns nil.  Both the UUID form of
    43  // xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx and
    44  // urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx are decoded.
    45  func Parse(s string) UUID {
    46  	if len(s) == 36+9 {
    47  		if strings.ToLower(s[:9]) != "urn:uuid:" {
    48  			return nil
    49  		}
    50  		s = s[9:]
    51  	} else if len(s) != 36 {
    52  		return nil
    53  	}
    54  	if s[8] != '-' || s[13] != '-' || s[18] != '-' || s[23] != '-' {
    55  		return nil
    56  	}
    57  	uuid := make([]byte, 16)
    58  	for i, x := range []int{
    59  		0, 2, 4, 6,
    60  		9, 11,
    61  		14, 16,
    62  		19, 21,
    63  		24, 26, 28, 30, 32, 34} {
    64  		if v, ok := xtob(s[x:]); !ok {
    65  			return nil
    66  		} else {
    67  			uuid[i] = v
    68  		}
    69  	}
    70  	return uuid
    71  }
    72  
    73  // Equal returns true if uuid1 and uuid2 are equal.
    74  func Equal(uuid1, uuid2 UUID) bool {
    75  	return bytes.Equal(uuid1, uuid2)
    76  }
    77  
    78  // String returns the string form of uuid, xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
    79  // , or "" if uuid is invalid.
    80  func (uuid UUID) String() string {
    81  	if uuid == nil || len(uuid) != 16 {
    82  		return ""
    83  	}
    84  	b := []byte(uuid)
    85  	return fmt.Sprintf("%08x-%04x-%04x-%04x-%012x",
    86  		b[:4], b[4:6], b[6:8], b[8:10], b[10:])
    87  }
    88  
    89  // URN returns the RFC 2141 URN form of uuid,
    90  // urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,  or "" if uuid is invalid.
    91  func (uuid UUID) URN() string {
    92  	if uuid == nil || len(uuid) != 16 {
    93  		return ""
    94  	}
    95  	b := []byte(uuid)
    96  	return fmt.Sprintf("urn:uuid:%08x-%04x-%04x-%04x-%012x",
    97  		b[:4], b[4:6], b[6:8], b[8:10], b[10:])
    98  }
    99  
   100  // Variant returns the variant encoded in uuid.  It returns Invalid if
   101  // uuid is invalid.
   102  func (uuid UUID) Variant() Variant {
   103  	if len(uuid) != 16 {
   104  		return Invalid
   105  	}
   106  	switch {
   107  	case (uuid[8] & 0xc0) == 0x80:
   108  		return RFC4122
   109  	case (uuid[8] & 0xe0) == 0xc0:
   110  		return Microsoft
   111  	case (uuid[8] & 0xe0) == 0xe0:
   112  		return Future
   113  	default:
   114  		return Reserved
   115  	}
   116  	panic("unreachable")
   117  }
   118  
   119  // Version returns the verison of uuid.  It returns false if uuid is not
   120  // valid.
   121  func (uuid UUID) Version() (Version, bool) {
   122  	if len(uuid) != 16 {
   123  		return 0, false
   124  	}
   125  	return Version(uuid[6] >> 4), true
   126  }
   127  
   128  func (v Version) String() string {
   129  	if v > 15 {
   130  		return fmt.Sprintf("BAD_VERSION_%d", v)
   131  	}
   132  	return fmt.Sprintf("VERSION_%d", v)
   133  }
   134  
   135  func (v Variant) String() string {
   136  	switch v {
   137  	case RFC4122:
   138  		return "RFC4122"
   139  	case Reserved:
   140  		return "Reserved"
   141  	case Microsoft:
   142  		return "Microsoft"
   143  	case Future:
   144  		return "Future"
   145  	case Invalid:
   146  		return "Invalid"
   147  	}
   148  	return fmt.Sprintf("BadVariant%d", int(v))
   149  }
   150  
   151  // SetRand sets the random number generator to r, which implents io.Reader.
   152  // If r.Read returns an error when the package requests random data then
   153  // a panic will be issued.
   154  //
   155  // Calling SetRand with nil sets the random number generator to the default
   156  // generator.
   157  func SetRand(r io.Reader) {
   158  	if r == nil {
   159  		rander = rand.Reader
   160  		return
   161  	}
   162  	rander = r
   163  }