initial commit
This commit is contained in:
parent
276c7845ed
commit
70a21f8a11
29
encoder.go
Normal file
29
encoder.go
Normal file
@ -0,0 +1,29 @@
|
||||
package ID
|
||||
|
||||
import "encoding/base64"
|
||||
|
||||
func Decode(input string) (t Type, lastError error) {
|
||||
ret, err := base64.URLEncoding.DecodeString(input)
|
||||
|
||||
if err != nil {
|
||||
lastError = err
|
||||
return
|
||||
}
|
||||
|
||||
for i := 2; i >= 0; i-- {
|
||||
t <<= 8
|
||||
t |= Type(ret[i])
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func (t Type) Encode() string {
|
||||
var buffer [3]byte
|
||||
for i := 0; i < 3; i++ {
|
||||
buffer[i] = byte(t)
|
||||
t >>= 8
|
||||
}
|
||||
|
||||
return base64.URLEncoding.EncodeToString(buffer[:])
|
||||
}
|
38
encoder_test.go
Normal file
38
encoder_test.go
Normal file
@ -0,0 +1,38 @@
|
||||
package ID_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"go.dedaa.de/julixau/inftut/ID"
|
||||
)
|
||||
|
||||
// Verify that the Encoder works
|
||||
func TestEncode(t *testing.T) {
|
||||
totest := ID.Type(100)
|
||||
str := totest.Encode()
|
||||
|
||||
if str != "ZAAA" {
|
||||
t.Fail()
|
||||
}
|
||||
|
||||
// encode a number that only fits in 3 bytes
|
||||
totest = ID.Type(100000)
|
||||
if totest.Encode() != "oIYB" {
|
||||
t.Fail()
|
||||
}
|
||||
}
|
||||
|
||||
// Test the decoder against the Encoder
|
||||
func TestDecode(t *testing.T) {
|
||||
id := ID.Type(100000)
|
||||
totest := id.Encode()
|
||||
|
||||
t.Log(id, totest)
|
||||
if res, err := ID.Decode(totest); err != nil {
|
||||
t.Fatal(err)
|
||||
} else if res != id {
|
||||
t.Fatal(res)
|
||||
} else {
|
||||
t.Log(res)
|
||||
}
|
||||
}
|
25
generator.go
Normal file
25
generator.go
Normal file
@ -0,0 +1,25 @@
|
||||
package ID
|
||||
|
||||
import "math/rand"
|
||||
|
||||
const MaxID = 2 << 24
|
||||
|
||||
type Type uint
|
||||
|
||||
type Generator struct {
|
||||
// IDEA: i hate you
|
||||
step Type
|
||||
Last Type
|
||||
}
|
||||
|
||||
func (idg Generator) Next() Type {
|
||||
idg.Last = (idg.Last + idg.step) % MaxID
|
||||
return idg.Last
|
||||
}
|
||||
|
||||
func New(seed uint32) Generator {
|
||||
return Generator{
|
||||
Last: Type(seed % MaxID),
|
||||
step: Type((rand.Uint32() % MaxID) | 1),
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user