Universally Unique Lexicographically Sortable Identifier (ULID) implementation for Dart, with binary implementation and monotonicity support.
UUID can be suboptimal for many use-cases because:
Instead, herein is proposed ULID:
var ulid = ULID.randomULID();
ULID
instance:var ulid = ULID.nextULID();
var ulidString = ulid.toString();
ULID
using ULIDFactory
var factory = ULIDFactory();
var ulid = factory.nextULID();
var ulidString = ulid.toString();
You can use ULIDFactory(Random)
to use a different Random
instance.
ULID
from/to bytes// generate a ULID instance
var ulid = ULID.nextULID();
// generate byte array (Uint8List) of ULID instance
var data = ulid.toBytes();
// generate a ULID from given byte array using 'fromBytes'
var ulidFromBytes = ULID.fromBytes(data);
ULID
from/to ULID string// generate a ULID string
var ulidString = ULID.randomULID();
// generate a ULID from given String using 'fromString'
var ulidFromString = ULID.fromString(ulidString);
// generate a ULID String from ULID instance
var ulidStringFromULID = ulid.toString();
ULID
// generate ULID instance using a monotonic factory
var ulid = ULID.nextMonotonicULID(ulid);
// using a monotonic factory, generate a ULID instance or null in case
// of overflow
var ulidStrict = ULID.nextMonotonicULIDStrict(ulidMono);
ULID
using ULIDMonocity
factory// generate ULID using ULID monotonic factory
var factory = ULIDMonotonic();
var ulid = factory.nextULID(ulid);
var ulidStrict = factory.nextULIDStrict(ulid);
Below is the current specification of ULID as implemented in this repository.
Timestamp
Entropy
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 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
01AN4Z07BY 79KA1307SR9X4MV3
|----------| |----------------|
Timestamp Entropy
10 chars 16 chars
48bits 80bits
base32 base32
ulid4d is an open-sourced software licensed under the BSD 3-clause license.