How to generate lexicographically sorted ULIDs multiple times per ms.
josehrami opened this issue · comments
How should I set up the entropy to generate lexicographically sorted ULIDs for the first 2 cases?
package main
import (
"fmt"
"math/rand"
"sort"
"time"
"github.com/oklog/ulid"
)
func main() {
run(time.Nanosecond)
run(time.Microsecond)
run(time.Millisecond)
}
func run(wait time.Duration) {
fmt.Printf("Generate 1 ULID every: %s\n", wait.String())
ids := []string{}
for i := 0; i < 10; i++ {
seed := time.Now().UnixNano()
source := rand.NewSource(seed)
entropy := rand.New(source)
id := ulid.MustNew(ulid.Timestamp(time.Now()), entropy).String()
ids = append(ids, id)
fmt.Println(id)
time.Sleep(wait)
}
fmt.Printf("Results are sorted: %t\n", sort.StringsAreSorted(ids))
}
outputs:
Generate 1 ULID every: 1ns
01ERZDG1G7NW4J1P7PNF21JXA1
01ERZDG1G89PRKEBPM05KVGH33
01ERZDG1G81H82CT5EGZ1WMRR2
01ERZDG1G8Y5KQVK7E5AW36SQB
01ERZDG1G85BAPHN0Y6Z2MKWCV
01ERZDG1G8X3C1YHKZJWPK4GV7
01ERZDG1G86B8TDA870HJ5SDQ4
01ERZDG1G8ZD2T95ZPZHWB50A7
01ERZDG1G8NGSF1KF6BV6CJ0V0
01ERZDG1G8GG7424V95JBCD9J8
Results are sorted: false
Generate 1 ULID every: 1µs
01ERZDG1G8ZVYN3PY11F1MNED2
01ERZDG1G87J51GMWXF56Q83CE
01ERZDG1G8HSFHR1MHJPV3AFND
01ERZDG1G8CNCBKG78SZVH4FKB
01ERZDG1G8NEA7YM61XHYZS4E0
01ERZDG1G8ZCZG33XNFSAAJK6Q
01ERZDG1G86RQ7YMX04AQC9SDX
01ERZDG1G81BPV6VSVXZMAJTQK
01ERZDG1G8C5JR0NX3CWMRWH51
01ERZDG1G83TDQKWZ04KT2R313
Results are sorted: false
Generate 1 ULID every: 1ms
01ERZDG1G8YA34MS33FW73KSRD
01ERZDG1G97THVX1Y1G9P8E3CE
01ERZDG1GAFMSDP7GYPMWTVK7Q
01ERZDG1GCGKFJ8Y5QQT90NX3Z
01ERZDG1GDR8MTDQNQHQVXYXKT
01ERZDG1GE1PZ8QQ7W1GZWVYXE
01ERZDG1GFNPA4X0GA5BAGNBQC
01ERZDG1GG2A6MCCFK5BBE74CT
01ERZDG1GH5Q1GMN1RTDZYWVDM
01ERZDG1GK1HXRCHQHFNE1YX4V
Results are sorted: true