Skip to content

Instantly share code, notes, and snippets.

@ploxiln
Last active September 8, 2019 20:49
Show Gist options
  • Save ploxiln/ba888565466f14f0fc27fba9d6a96baf to your computer and use it in GitHub Desktop.
Save ploxiln/ba888565466f14f0fc27fba9d6a96baf to your computer and use it in GitHub Desktop.
package main
import (
"regexp"
"strings"
"testing"
)
var hexVal = [256]bool{
false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
true, true, true, true, true, true, true, true, true, true, false, false, false, false, false, false,
false, true, true, true, true, true, true, false, false, false, false, false, false, false, false, false,
false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
false, true, true, true, true, true, true, false, false, false, false, false, false, false, false, false,
false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
}
func validUUID4(s string) bool {
if len(s) != 36 || s[8] != '-' || s[13] != '-' || s[18] != '-' || s[23] != '-' || s[14] != '4' {
return false
}
if s[19] != 'a' && s[19] != 'b' && s[19] != 'A' && s[19] != 'B' &&
s[19] != '8' && s[19] != '9' {
return false
}
for i := 0; i < 36; i++ {
if i == 8 || i == 13 || i == 14 || i == 18 || i == 19 || i == 23 {
continue
}
if !hexVal[s[i]] {
return false
}
}
return true
}
func rangeUUID4(s string) bool {
if len(s) != 36 || s[14] != '4' || strings.IndexByte("89ABab", s[19]) == -1 {
return false
}
for i := 0; i < 36; i++ {
if i == 8 || i == 13 || i == 18 || i == 23 {
if s[i] != '-' {
return false
}
} else {
c := s[i]
if !((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f')) {
return false
}
}
}
return true
}
var (
reUUID4 = regexp.MustCompile(`^[0-9A-Za-z]{8}-[0-9A-Za-z]{4}-4[0-9A-Fa-f]{3}-[89ABab][0-9A-Fa-f]{3}-[0-9A-Fa-f]{12}$`)
reUUID = regexp.MustCompile(`^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[1-5][0-9A-Fa-f]{3}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$`)
)
func regexUUID4(s string) bool {
return reUUID4.MatchString(s)
}
// UUID1 etc would also be fine
func regexUUID(s string) bool {
return reUUID.MatchString(s)
}
var testUUIDs = [4]string{
"B2A5E1FF-C80A-4928-87B8-EA11A08B1428",
"517fba5b-3398-4096-8593-03abbdd937b5",
"e9fac82f-b98c-46e3-9571-a7d8f3ffab86",
"9C39FD5D-EA43-4DB7-A7DF-542FE8C0F17B",
}
func benchmarkUUID(b *testing.B, fn func(string)bool) {
for i := 0; i < b.N; i++ {
if !fn(testUUIDs[i & 0x3]) {
b.Errorf("invalid uuid: %q", testUUIDs[i & 0x3])
}
}
}
func BenchmarkValidUUID4(b *testing.B) {
benchmarkUUID(b, validUUID4)
}
func BenchmarkRegexUUID4(b *testing.B) {
benchmarkUUID(b, regexUUID4)
}
func BenchmarkRegexUUID(b *testing.B) {
benchmarkUUID(b, regexUUID)
}
func BenchmarkRangeUUID(b *testing.B) {
benchmarkUUID(b, rangeUUID4)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment