diff --git a/model.go b/model.go index ddd0185..4f6b5e5 100644 --- a/model.go +++ b/model.go @@ -229,7 +229,8 @@ type Record interface { var randPool = &sync.Pool{ New: func() interface{} { - return rand.NewSource(time.Now().UnixNano()) + seed := time.Now().UnixNano() + rand.Int63() + return rand.NewSource(seed) }, } diff --git a/model_test.go b/model_test.go index eb1b9d4..fe17c67 100644 --- a/model_test.go +++ b/model_test.go @@ -1,6 +1,7 @@ package kallax import ( + "sync" "testing" "github.com/stretchr/testify/require" @@ -23,16 +24,34 @@ func TestULID_Value(t *testing.T) { func TestUULID_ThreeNewIDsAreDifferent(t *testing.T) { r := require.New(t) - id1 := NewULID() - id2 := NewULID() - id3 := NewULID() - r.NotEqual(id1, id2) - r.NotEqual(id1, id3) - r.NotEqual(id2, id3) - - r.True(id1 == id1) - r.False(id1 == id2) + goroutines := 100 + ids_per_goroutine := 1000 + + ids := make(map[ULID]bool, ids_per_goroutine*goroutines) + m := &sync.Mutex{} + + wg := &sync.WaitGroup{} + wg.Add(goroutines) + for i := 0; i < goroutines; i++ { + go func() { + var oids []ULID + for j := 0; j < ids_per_goroutine; j++ { + oids = append(oids, NewULID()) + } + + m.Lock() + for _, id := range oids { + ids[id] = true + } + m.Unlock() + wg.Done() + }() + } + + wg.Wait() + + r.Equal(goroutines*ids_per_goroutine, len(ids)) } func TestULID_ScanValue(t *testing.T) {