diff --git a/uuid_source.go b/uuid_source.go new file mode 100644 index 0000000..211b052 --- /dev/null +++ b/uuid_source.go @@ -0,0 +1,40 @@ +package uuid + +import ( + "io" + "crypto/rand" +) + +type UuidSource struct { + rander io.Reader +} + +func NewSource(r io.Reader) UuidSource { + var uuidSource UuidSource + uuidSource.SetRand(r) + return uuidSource + +} + +func (uuidSource *UuidSource) SetRand(r io.Reader) { + if r == nil { + uuidSource.rander = rand.Reader + return + } + uuidSource.rander = r +} + +func (uuidSource UuidSource) NewRandom() (UUID, error) { + var uuid UUID + _, err := io.ReadFull(uuidSource.rander, uuid[:]) + if err != nil { + return Nil, err + } + uuid[6] = (uuid[6] & 0x0f) | 0x40 // Version 4 + uuid[8] = (uuid[8] & 0x3f) | 0x80 // Variant is 10 + return uuid, nil +} + +func (uuidSource UuidSource) New() UUID { + return Must(uuidSource.NewRandom()) +} diff --git a/uuid_source_test.go b/uuid_source_test.go new file mode 100644 index 0000000..40bf995 --- /dev/null +++ b/uuid_source_test.go @@ -0,0 +1,55 @@ +package uuid + +import ( + "testing" + "fmt" + "strings" + "math/rand" + +) + +func TestUuidSources(t *testing.T) { + + uuidSourceA := NewSource(rand.New(rand.NewSource(34576))) + uuidSourceB := NewSource(rand.New(rand.NewSource(34576))) + + var uuidStrA, uuidStrB string + fmt.Printf("Random values: ") + for i := 0; i < 10; i++ { + uuidStrA += uuidSourceA.New().String() + "." + } + fmt.Printf("%v\n", uuidStrA) + + fmt.Printf("Random values: ") + for i := 0; i < 10; i++ { + uuidStrB += uuidSourceB.New().String() + "." + } + fmt.Printf("%v\n", uuidStrB) + + if !strings.EqualFold(uuidStrA, uuidStrB) { + t.Error("Uuid values are not reproducaible!") + } + + uuidSourceA = NewSource(rand.New(rand.NewSource(66))) + uuidSourceB = NewSource(rand.New(rand.NewSource(77))) + + + uuidStrA = "" + uuidStrB = "" + fmt.Printf("Random values: ") + for i := 0; i < 10; i++ { + uuidStrA += uuidSourceA.New().String() + "." + } + fmt.Printf("%v\n", uuidStrA) + + fmt.Printf("Random values: ") + for i := 0; i < 10; i++ { + uuidStrB += uuidSourceB.New().String() + "." + } + fmt.Printf("%v\n", uuidStrB) + + if strings.EqualFold(uuidStrA, uuidStrB) { + t.Error("Uuid values should not be reproducaible!") + } + +} \ No newline at end of file