github.com/akerouanton/docker@v1.11.0-rc3/pkg/stringid/stringid.go (about)

     1  // Package stringid provides helper functions for dealing with string identifiers
     2  package stringid
     3  
     4  import (
     5  	"crypto/rand"
     6  	"encoding/hex"
     7  	"io"
     8  	"regexp"
     9  	"strconv"
    10  	"strings"
    11  
    12  	"github.com/docker/docker/pkg/random"
    13  )
    14  
    15  const shortLen = 12
    16  
    17  var validShortID = regexp.MustCompile("^[a-z0-9]{12}$")
    18  
    19  // IsShortID determines if an arbitrary string *looks like* a short ID.
    20  func IsShortID(id string) bool {
    21  	return validShortID.MatchString(id)
    22  }
    23  
    24  // TruncateID returns a shorthand version of a string identifier for convenience.
    25  // A collision with other shorthands is very unlikely, but possible.
    26  // In case of a collision a lookup with TruncIndex.Get() will fail, and the caller
    27  // will need to use a langer prefix, or the full-length Id.
    28  func TruncateID(id string) string {
    29  	if i := strings.IndexRune(id, ':'); i >= 0 {
    30  		id = id[i+1:]
    31  	}
    32  	trimTo := shortLen
    33  	if len(id) < shortLen {
    34  		trimTo = len(id)
    35  	}
    36  	return id[:trimTo]
    37  }
    38  
    39  func generateID(crypto bool) string {
    40  	b := make([]byte, 32)
    41  	r := random.Reader
    42  	if crypto {
    43  		r = rand.Reader
    44  	}
    45  	for {
    46  		if _, err := io.ReadFull(r, b); err != nil {
    47  			panic(err) // This shouldn't happen
    48  		}
    49  		id := hex.EncodeToString(b)
    50  		// if we try to parse the truncated for as an int and we don't have
    51  		// an error then the value is all numeric and causes issues when
    52  		// used as a hostname. ref #3869
    53  		if _, err := strconv.ParseInt(TruncateID(id), 10, 64); err == nil {
    54  			continue
    55  		}
    56  		return id
    57  	}
    58  }
    59  
    60  // GenerateRandomID returns an unique id.
    61  func GenerateRandomID() string {
    62  	return generateID(true)
    63  
    64  }
    65  
    66  // GenerateNonCryptoID generates unique id without using cryptographically
    67  // secure sources of random.
    68  // It helps you to save entropy.
    69  func GenerateNonCryptoID() string {
    70  	return generateID(false)
    71  }