diff options
-rw-r--r-- | src/gobang.go | 124 | ||||
-rw-r--r-- | tests/gobang.go | 128 |
2 files changed, 12 insertions, 240 deletions
diff --git a/src/gobang.go b/src/gobang.go index c8ab0f3..73540d2 100644 --- a/src/gobang.go +++ b/src/gobang.go @@ -5,7 +5,6 @@ import ( "crypto/rand" "crypto/sha256" "encoding/binary" - "encoding/hex" "errors" "fmt" "hash" @@ -21,7 +20,8 @@ import ( "strings" "sync" "syscall" - "time" + + "guuid" ) @@ -36,15 +36,6 @@ const ( ) -const ( - uuidDashCount = 4 - uuidByteCount = 16 - uuidEncodedLength = (uuidByteCount * 2) + uuidDashCount -) -type UUID struct { - bytes [uuidByteCount]byte -} - type Gauge struct { Inc func(...any) Dec func(...any) @@ -413,111 +404,6 @@ func Hash(password []byte, salt []byte) []byte{ return hash } -// getV7Time returns the time in milliseconds and nanoseconds / 256. -// The returned (milli << (12 + seq)) is guaranteed to be greater than -// (milli << (12 + seq)) returned by any previous call to getV7Time. -// `seq` Sequence number is between 0 and 3906 (nanoPerMilli >> 8) -func getV7Time(nano int64) (int64, int64) { - const nanoPerMilli = 1000 * 1000 - - milli := nano / nanoPerMilli - seq := (nano - (milli * nanoPerMilli)) >> 8 - now := milli << (12 + seq) - - timeMutex.Lock() - defer timeMutex.Unlock() - if now <= lastV7Time { - now = lastV7Time + 1 - milli = now >> 12 - seq = now & 0xfff - } - lastV7Time = now - return milli, seq -} - -func newUUIDFrom(randomBuffer [uuidByteCount]byte, now int64) UUID { - randomBuffer[6] = (randomBuffer[6] & 0x0f) | 0x40 // Version 4 - randomBuffer[8] = (randomBuffer[8] & 0x3f) | 0x80 // Variant is 10 - - t, s := getV7Time(now) - - randomBuffer[0] = byte(t >> 40) - randomBuffer[1] = byte(t >> 32) - randomBuffer[2] = byte(t >> 24) - randomBuffer[3] = byte(t >> 16) - randomBuffer[4] = byte(t >> 8) - randomBuffer[5] = byte(t >> 0) - - randomBuffer[6] = 0x70 | (0x0f & byte(s >> 8)) - randomBuffer[7] = byte(s) - return UUID { bytes: randomBuffer } -} - -func NewUUID() UUID { - var buffer [uuidByteCount]byte - _, err := io.ReadFull(rand.Reader, buffer[7:]) - FatalIf(err) - - now := time.Now().UnixNano() - return newUUIDFrom(buffer, now) -} - -func (uuid UUID) String() string { - dst := [uuidEncodedLength]byte { - 0, 0, 0, 0, - 0, 0, 0, 0, - '-', - 0, 0, 0, 0, - '-', - 0, 0, 0, 0, - '-', - 0, 0, 0, 0, - '-', - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - } - - hex.Encode(dst[ 0:8], uuid.bytes[0:4]) - hex.Encode(dst[ 9:13], uuid.bytes[4:6]) - hex.Encode(dst[14:18], uuid.bytes[6:8]) - hex.Encode(dst[19:23], uuid.bytes[8:10]) - hex.Encode(dst[24:36], uuid.bytes[10:]) - - return string(dst[:]) -} - -var ( - dashIndexes = []int { 8, 13, 18, 23 } - emptyUUID = UUID {} - badUUIDLengthError = errors.New("str isn't of the correct length") - badUUIDDashCountError = errors.New("Bad count of dashes in string") - badUUIDDashPositionError = errors.New("Bad char in string") -) -func ParseUUID(str string) (UUID, error) { - if len(str) != uuidEncodedLength { - return emptyUUID, badUUIDLengthError - } - - if strings.Count(str, "-") != uuidDashCount { - return emptyUUID, badUUIDDashCountError - } - - for _, idx := range dashIndexes { - if str[idx] != '-' { - return emptyUUID, badUUIDDashPositionError - } - } - - hexstr := strings.Join(strings.Split(str, "-"), "") - data, err := hex.DecodeString(hexstr) - if err != nil { - return emptyUUID, err - } - - return UUID { bytes: [uuidByteCount]byte(data) }, nil -} - func sourceInfo(skip int) slog.Attr { pc := make([]uintptr, 10) n := runtime.Callers(skip, pc) @@ -543,7 +429,7 @@ func sourceInfo(skip int) slog.Attr { func logArgs(type_ string) []string { return []string { - "id", NewUUID().String(), + "id", guuid.New().String(), "kind", "log", "type", type_, } @@ -626,7 +512,7 @@ func metric(type_ string, label string, args ...any) { "_", slices.Concat( []any { - "id", NewUUID().String(), + "id", guuid.New().String(), "kind", "metric", "type", type_, "label", label, @@ -763,7 +649,7 @@ func SetLoggerOutput(w io.Writer, args ...any) { "info", "pid", os.Getpid(), "ppid", os.Getppid(), - "puuid", NewUUID().String(), + "puuid", guuid.New().String(), ), ).With(args...)) } diff --git a/tests/gobang.go b/tests/gobang.go index b26fc7e..a22fc02 100644 --- a/tests/gobang.go +++ b/tests/gobang.go @@ -13,6 +13,8 @@ import ( "os" "strings" "time" + + "guuid" ) @@ -383,117 +385,6 @@ func test_Hash() { }) } -func test_getV7Time() { - // FIXME -} - -func test_newUUIDFrom() { - TestStart("newUUIDFrom()") - - Testing("same UUID from same input", func() { - for i := 0; i < 100; i++ { - var b [uuidByteCount]byte - buffer := Random(uuidByteCount) - now := time.Now().UnixNano() - - lastV7Time = now + 1 - copy(b[:], buffer) - uuid1 := newUUIDFrom(b, now) - - lastV7Time = now + 1 - copy(b[:], buffer) - uuid2 := newUUIDFrom(b, now) - - AssertEqual(uuid1, uuid2) - } - }) -} - -func test_NewUUID() { - TestStart("NewUUID()") - - Testing("we can generate UUID values", func() { - var uuid UUID = NewUUID() - AssertEqual(len(uuid.bytes), uuidByteCount) - }) -} - -func test_UUIDString() { - TestStart("UUID.String()") - - Testing("simple example values", func() { - uuids := []UUID { - UUID { - bytes: [uuidByteCount]byte { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }, - }, - UUID { - bytes: [uuidByteCount]byte { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, - }, - }, - UUID { - bytes: [uuidByteCount]byte { - 222, 222, 222, 222, 222, 222, 222, 222, - 222, 222, 222, 222, 222, 222, 222, 222, - }, - }, - UUID { - bytes: [uuidByteCount]byte { - 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, - }, - }, - } - - strs := []string { - "00000000-0000-0000-0000-000000000000", - "00010203-0405-0607-0809-0a0b0c0d0e0f", - "dededede-dede-dede-dede-dededededede", - "ffffffff-ffff-ffff-ffff-ffffffffffff", - } - - for i := range uuids { - AssertEqual(uuids[i].String(), strs[i]) - } - }) -} - -func test_ParseUUID() { - TestStart("ParseUUID()") - - Testing("UUID -> string -> UUID round trip", func() { - for i := 0; i < 100; i++ { - uuid0 := NewUUID() - uuid1, err := ParseUUID(uuid0.String()) - ErrorIf(err) - AssertEqual(uuid1, uuid0) - } - }) - - Testing("errors we detect", func() { - var err error - - _, err = ParseUUID("") - AssertEqual(err, badUUIDLengthError) - - _, err = ParseUUID("---000000000000000000000000000000000") - AssertEqual(err, badUUIDDashCountError) - - _, err = ParseUUID("----00000000000000000000000000000000") - AssertEqual(err, badUUIDDashPositionError) - - _, err = ParseUUID("00000000-0000-0000-0000-00000000000g") - AssertEqual(err, hex.InvalidByteError('g')) - - _, err = ParseUUID("00000000-0000-0000-0000-000000000000") - ErrorIf(err) - }) -} - func test_sourceInfo() { TestStart("sourceInfo()") @@ -546,7 +437,7 @@ func test_logArgs() { AssertEqual(len(args), 6) AssertEqual(args[0], "id") - _, err := ParseUUID(args[1]) + _, err := guuid.FromString(args[1]) ErrorIf(err) expected := []string { "kind", "log", "type", "the-type" } @@ -745,7 +636,7 @@ func test_metric() { AssertEqual(ok, true) id, ok := idRaw.(string) AssertEqual(ok, true) - _, err = ParseUUID(id) + _, err = guuid.FromString(id) ErrorIf(err) kindRaw, ok := data["kind"] @@ -1038,7 +929,7 @@ func test_SetLoggerOutput() { AssertEqual(ok, true) puuid, ok := puuidRaw.(string) AssertEqual(ok, true) - _, err = ParseUUID(puuid) + _, err = guuid.FromString(puuid) ErrorIf(err) }) @@ -1097,9 +988,9 @@ func test_SetLoggerOutput() { puuid2 := puuidFromString(log2) AssertEqual(puuid1, puuid2) - uuid1, err := ParseUUID(puuid1) + uuid1, err := guuid.FromString(puuid1) ErrorIf(err) - uuid2, err := ParseUUID(puuid2) + uuid2, err := guuid.FromString(puuid2) ErrorIf(err) AssertEqual(uuid1, uuid2) }) @@ -1272,11 +1163,6 @@ func t3() { func t4() { test_Random() test_Salt() - test_getV7Time() - test_newUUIDFrom() - test_NewUUID() - test_UUIDString() - test_ParseUUID() test_sourceInfo() test_logArgs() test_anyArr() |