Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

ULID

ULID (Universally Unique Lexicographically Sortable Identifier) is a 128-bit identifier designed for distributed systems that need sortable, URL-friendly IDs.

Overview

PropertyValue
Bits128
SortableYes
TimestampYes (millisecond precision)
FormatCrockford Base32
Length26 characters

Format

 01ARZ3NDEKTSV4RRFFQ69G5FAV
 |----------|--------------|
  Timestamp      Random
  (48 bits)     (80 bits)

Example: 01ARZ3NDEKTSV4RRFFQ69G5FAV

Characteristics

Time-Sortable

ULIDs sort lexicographically in chronological order:

$ idt gen ulid
01ARZ3NDEKTSV4RRFFQ69G5FAV
$ idt gen ulid
01ARZ3NDEKTSV4RRFFQ69G5FAW

The second ULID will always sort after the first.

Monotonic

Within the same millisecond, ULIDs increment the random component to maintain ordering:

# Generated in same millisecond
01ARZ3NDEKTSV4RRFFQ69G5FAV
01ARZ3NDEKTSV4RRFFQ69G5FAW  # Random incremented
01ARZ3NDEKTSV4RRFFQ69G5FAX  # Random incremented again

Case-Insensitive

ULIDs use Crockford Base32, which is case-insensitive:

# These are equivalent
idt inspect 01ARZ3NDEKTSV4RRFFQ69G5FAV
idt inspect 01arz3ndektsv4rrffq69g5fav

URL-Safe

The Crockford Base32 alphabet excludes ambiguous characters (I, L, O, U) and is URL-safe.

Generation

# Generate a ULID
idt gen ulid

# Generate multiple ULIDs
idt gen ulid -n 10

Inspection

$ idt inspect 01ARZ3NDEKTSV4RRFFQ69G5FAV
ULID
  01ARZ3NDEKTSV4RRFFQ69G5FAV

  Time (UTC)          2016-07-30T23:54:10.259Z
  Local Time (+09:00) 2016-07-31T08:54:10.259+09:00
  Random              80 bits

  Hex                 01563e3ab5d3d6764c61efb99302bd5b
  Base64              AVY+OrXT1nZMYe+5kwK9Ww==
  Int                 1777027686520646174104517696511196507

Conversion

ULID to UUID

ULIDs are 128-bit and can be converted to UUID format:

# Get hex representation (same as UUID without dashes)
idt convert 01ARZ3NDEKTSV4RRFFQ69G5FAV -f hex
# Output: 01563e3ab5d3d6764c61efb99302bd5b

To Other Formats

# Base64
idt convert 01ARZ3NDEKTSV4RRFFQ69G5FAV -f base64

# Integer
idt convert 01ARZ3NDEKTSV4RRFFQ69G5FAV -f int

# Binary
idt convert 01ARZ3NDEKTSV4RRFFQ69G5FAV -f bits

Comparison with UUID

FeatureULIDUUIDv4UUIDv7
Bits128128128
SortableYesNoYes
TimestampYesNoYes
String length263636
Case-sensitiveNoNoNo
URL-safeYesWith encodingWith encoding

When to Use ULID

Good for:

  • Database primary keys (sortable, compact)
  • Distributed systems needing time-ordered IDs
  • URLs and APIs (shorter than UUID)
  • Any use case needing sortable unique IDs

Consider alternatives if:

  • You need UUID compatibility (use UUIDv7)
  • You need sub-millisecond precision
  • You need 64-bit IDs (use Snowflake)

Specification

  • GitHub: https://github.com/ulid/spec

Crockford Base32 Alphabet

0123456789ABCDEFGHJKMNPQRSTVWXYZ

Excludes: I, L, O, U (to avoid confusion with 1, 1, 0, V)