Quellcode durchsuchen

Merge pull request #44661 from thaJeztah/optimize_stringid

pkg/stringid: optimize performance
Sebastiaan van Stijn vor 2 Jahren
Ursprung
Commit
13b36ce063
2 geänderte Dateien mit 42 neuen und 7 gelöschten Zeilen
  1. 16 6
      pkg/stringid/stringid.go
  2. 26 1
      pkg/stringid/stringid_test.go

+ 16 - 6
pkg/stringid/stringid.go

@@ -4,21 +4,28 @@ package stringid // import "github.com/docker/docker/pkg/stringid"
 import (
 import (
 	"crypto/rand"
 	"crypto/rand"
 	"encoding/hex"
 	"encoding/hex"
-	"fmt"
+	"errors"
 	"regexp"
 	"regexp"
 	"strconv"
 	"strconv"
 	"strings"
 	"strings"
 )
 )
 
 
-const shortLen = 12
+const (
+	shortLen = 12
+	fullLen  = 64
+)
 
 
 var (
 var (
 	validShortID = regexp.MustCompile("^[a-f0-9]{12}$")
 	validShortID = regexp.MustCompile("^[a-f0-9]{12}$")
 	validHex     = regexp.MustCompile(`^[a-f0-9]{64}$`)
 	validHex     = regexp.MustCompile(`^[a-f0-9]{64}$`)
 )
 )
 
 
-// IsShortID determines if an arbitrary string *looks like* a short ID.
+// IsShortID determines if id has the correct format and length for a short ID.
+// It checks the IDs length and if it consists of valid characters for IDs (a-f0-9).
 func IsShortID(id string) bool {
 func IsShortID(id string) bool {
+	if len(id) != shortLen {
+		return false
+	}
 	return validShortID.MatchString(id)
 	return validShortID.MatchString(id)
 }
 }
 
 
@@ -54,10 +61,13 @@ func GenerateRandomID() string {
 	}
 	}
 }
 }
 
 
-// ValidateID checks whether an ID string is a valid image ID.
+// ValidateID checks whether an ID string is a valid, full-length image ID.
 func ValidateID(id string) error {
 func ValidateID(id string) error {
-	if ok := validHex.MatchString(id); !ok {
-		return fmt.Errorf("image ID %q is invalid", id)
+	if len(id) != fullLen {
+		return errors.New("image ID '" + id + "' is invalid")
+	}
+	if !validHex.MatchString(id) {
+		return errors.New("image ID '" + id + "' is invalid")
 	}
 	}
 	return nil
 	return nil
 }
 }

+ 26 - 1
pkg/stringid/stringid_test.go

@@ -8,7 +8,7 @@ import (
 func TestGenerateRandomID(t *testing.T) {
 func TestGenerateRandomID(t *testing.T) {
 	id := GenerateRandomID()
 	id := GenerateRandomID()
 
 
-	if len(id) != 64 {
+	if len(id) != fullLen {
 		t.Fatalf("Id returned is incorrect: %s", id)
 		t.Fatalf("Id returned is incorrect: %s", id)
 	}
 	}
 }
 }
@@ -62,3 +62,28 @@ func TestIsShortIDNotCorrectSize(t *testing.T) {
 		t.Fatalf("%s is not a short ID", id)
 		t.Fatalf("%s is not a short ID", id)
 	}
 	}
 }
 }
+
+var testIDs = []string{
+	"4e38e38c8ce0",
+	strings.Repeat("a", shortLen+1),
+	strings.Repeat("a", 16000),
+	"90435eec5c4e124e741ef731e118be2fc799a68aba0466ec17717f24ce2ae6a2",
+}
+
+func BenchmarkIsShortID(b *testing.B) {
+	b.ReportAllocs()
+	for i := 0; i < b.N; i++ {
+		for _, id := range testIDs {
+			_ = IsShortID(id)
+		}
+	}
+}
+
+func BenchmarkValidateID(b *testing.B) {
+	b.ReportAllocs()
+	for i := 0; i < b.N; i++ {
+		for _, id := range testIDs {
+			_ = ValidateID(id)
+		}
+	}
+}