
Generates universally unique, lexicographically sortable identifiers with 128-bit compatibility, high efficiency, and monotonic sort order. It supports custom entropy sources and provides multiple methods for generating and parsing identifiers.
Universally Unique Lexicographically Sortable Identifier
Kotlin implementation of ULID with multiplatform support.
UUID can be suboptimal for many use-cases because:
Instead, herein is proposed ULID:
Add the Maven Central repository if it is not already there:
repositories {
mavenCentral()
}Add a dependency to the dependencies block:
dependencies {
implementation "com.aallam.ulid:ulid-kotlin:$version"
}In multiplatform projects, add a dependency to the commonMain source set dependencies.
ULID.randomULID()ULID instance:val ulid = ULID.nextULID()
val ulidString = ulid.toString()ULID using ULID.Factory
val factory = ULID.Factory()
val ulid = factory.nextULID()
val ulidString = ulid.toString()The default constructor is using default kotlin.random.Random but you can also use the ULID.Factory(Random) builder
function to use a different Random instance.
// generate a ULID String
val ulidString: String = ULID.randomULID()
// generate a ULID instance
val ulid: ULID = ULID.nextULID()
// generate the ByteArray for a ULID instance
val data: ByteArray = ulid.toBytes()
// generate a ULID from given ByteArray using 'fromBytes' function
val ulidFromBytes: ByteArray = ULID.fromBytes(data)
// generate a ULID from given String using 'parseULID' function
val ulidFromString: ULID = ULID.parseULID(ulidString)
// generate a ULID String from ULID instance
val ulidStringFromULID: ULID = ulid.toString()// generate ULID instance using a monotonic factory
val ulid: ULID = ULID.Monotonic.nextULID(previousULID)
// using a monotonic factory, generate a ULID instance or null in case of overflow
val ulidStrict: ULID? = ULID.Monotonic.nextULIDStrict(previousULID)A thread-safe, stateful monotonic generator that internally tracks the previously generated ULID:
val generator = ULID.StatefulMonotonic()
// generate the next monotonic ULID
val ulid: ULID = generator.nextULID()
// generate the next strict monotonic ULID, or null on overflow
val ulidStrict: ULID? = generator.nextULIDStrict()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
ULID for Kotlin is an open-sourced software licensed under the MIT license.
Universally Unique Lexicographically Sortable Identifier
Kotlin implementation of ULID with multiplatform support.
UUID can be suboptimal for many use-cases because:
Instead, herein is proposed ULID:
Add the Maven Central repository if it is not already there:
repositories {
mavenCentral()
}Add a dependency to the dependencies block:
dependencies {
implementation "com.aallam.ulid:ulid-kotlin:$version"
}In multiplatform projects, add a dependency to the commonMain source set dependencies.
ULID.randomULID()ULID instance:val ulid = ULID.nextULID()
val ulidString = ulid.toString()ULID using ULID.Factory
val factory = ULID.Factory()
val ulid = factory.nextULID()
val ulidString = ulid.toString()The default constructor is using default kotlin.random.Random but you can also use the ULID.Factory(Random) builder
function to use a different Random instance.
// generate a ULID String
val ulidString: String = ULID.randomULID()
// generate a ULID instance
val ulid: ULID = ULID.nextULID()
// generate the ByteArray for a ULID instance
val data: ByteArray = ulid.toBytes()
// generate a ULID from given ByteArray using 'fromBytes' function
val ulidFromBytes: ByteArray = ULID.fromBytes(data)
// generate a ULID from given String using 'parseULID' function
val ulidFromString: ULID = ULID.parseULID(ulidString)
// generate a ULID String from ULID instance
val ulidStringFromULID: ULID = ulid.toString()// generate ULID instance using a monotonic factory
val ulid: ULID = ULID.Monotonic.nextULID(previousULID)
// using a monotonic factory, generate a ULID instance or null in case of overflow
val ulidStrict: ULID? = ULID.Monotonic.nextULIDStrict(previousULID)A thread-safe, stateful monotonic generator that internally tracks the previously generated ULID:
val generator = ULID.StatefulMonotonic()
// generate the next monotonic ULID
val ulid: ULID = generator.nextULID()
// generate the next strict monotonic ULID, or null on overflow
val ulidStrict: ULID? = generator.nextULIDStrict()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
ULID for Kotlin is an open-sourced software licensed under the MIT license.