Universally Unique Lexicographically Sortable Identifier
UUID can be suboptimal for many uses-cases because:
Instead, herein is proposed ULID:
npm install --save ulid
import ulid from 'ulid'
ulid() // 01ARZ3NDEKTSV4RRFFQ69G5FAV
From the community!
| Language | Author | Binary Implementation |
|---|---|---|
| Crystal | SuperPaintman | |
| Erlang | savonarola | |
| Elixir | merongivian | |
| Go | imdario | |
| Go | oklog | ✓ |
| Java | Lewiscowles1986 | |
| Julia | ararslan | |
| .NET | RobThree | |
| .NET | fvilers | |
| PHP | Lewiscowles1986 | |
| Python | mdipierro | |
| Ruby | rafaelsales | |
| Rust | mmacedoeu |
Below is the current specification of ULID as implemented in this repository. Note: the binary format has not been implemented.
01AN4Z07BY 79KA1307SR9X4MV3
|----------| |----------------|
Timestamp Randomness
10 chars 16 chars
48bits 80bits
base32 base32
Timestamp
Randomness
The left-most character must be sorted first, and the right-most character sorted last (lexical order). The default ASCII character set must be used. Within the same millisecond, sort order is not guaranteed
Crockford’s Base32 is used as shown. This alphabet excludes the letters I, L, O, and U to avoid confusion and abuse.
0123456789ABCDEFGHJKMNPQRSTVWXYZ
The components are encoded as 16 octets. Each component is encoded with the Most Significant Byte first (network byte order).
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 32_bit_uint_time_high |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 16_bit_uint_time_low | 16_bit_uint_random |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 32_bit_uint_random |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 32_bit_uint_random |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
ttttttttttrrrrrrrrrrrrrrrr
where
t is Timestamp
r is Randomness
Partly inspired by:
npm test
npm run perf
ulid
336,331,131 op/s » encodeTime
102,041,736 op/s » encodeRandom
17,408 op/s » generate
Suites: 1
Benches: 3
Elapsed: 7,285.75 ms