oklog / ulid

Universally Unique Lexicographically Sortable Identifier (ULID) in Go

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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