Identifiers

ULID generator& timestamp decoder

Create a batch or inspect existing IDs. Generation is manual; decoding can update automatically.

ULID generator

Input

Leave empty to sample the current millisecond once for this batch. Otherwise enter an integer from 0 to 281474976710655; ISO dates and seconds are not inferred.

Processing stays in this browser. Inputs are not sent to a server.

Result

Settings

On: draw the first 80-bit tail, then increment it for each ID. Off: draw each tail independently. Every click starts a new batch; there is no ordering promise between batches.

1–1,000 IDs; decode up to 1,000 physical lines and 100,000 UTF-16 code units. Exports include the entire result.

Choose settings, then run.

A ULID generator helps when you need sortable test records or want to understand an ID in a log. The useful question is often whether its embedded time and its position in a batch agree, rather than whether the string merely has 26 characters.

Choose a fixed millisecond to reproduce a time prefix without fixing the random tail. When inspecting existing values, the report keeps the original line number even after sorting, so an unexpected position can be traced back to the input.

Why use this ULID generator?

Read the time without guessing its unit

The ULID generator separates the ten-character timestamp from the sixteen-character random tail. UTC and the original integer milliseconds appear together, so a seconds-versus-milliseconds mistake does not hide behind a formatted date.

An identifier separates into a clock-linked prefix and an opaque random tail.

Trace a sorted result back to its source

Sorting produces a report without moving input lines. Each decoded record retains sourceLine, including repeated values; you can compare a changed position with the exact value originally supplied.

Unsorted identifier rows connect to ordered rows while their original positions remain visible.

Check the clock and the ordering scope

01

Use a known millisecond when comparing

The generation example loads a fixed timestamp but does not generate IDs. Empty time means the current instant at execution; a value such as 1700000000 is interpreted literally as milliseconds.

  • Each batch samples its time once, even when it contains 1,000 IDs.
02

Choose the guarantee you need

Monotonic mode increments the random tail inside this batch. Turn it off to see how independent tails at the same millisecond can sort differently from their generation order.

  • The next click starts with fresh randomness, even for the same chosen time.
03

Compare order without rewriting input

In Decode, Example loads deliberately shuffled values. Switch Result order to ASCII ascending and compare sourceLine. Auto decoding waits 350 ms; disable it for the Decode button or Ctrl/Cmd+Enter.

  • Edits immediately disable export. Example and Clear require a preview, with one-step Undo.

Inspect the complete 128-bit structure

Batch fixtures at a chosen time

Generate 1–1,000 standard uppercase identifiers. Fixed time fixes only the first ten characters; the remaining eighty bits come from secure random bytes, followed by increments when monotonic mode is on.

Timestamp and tail decoding

The ULID decoder reports the ULID timestamp as Unix milliseconds and UTC ISO time, along with both encoded parts and the random tail in hexadecimal. Nothing in that tail identifies a user or machine.

A strict, atomic validation report

A malformed character, length error or overflow reports its physical line and column. The whole decode fails, so copying cannot silently discard invalid entries while presenting a smaller successful batch.

Complete TXT and JSON results

Generation exports one ID per line as TXT, or a JSON batch with its time and monotonic flag. Decoding exports all field records, including rows beyond the initial fifty-row preview.

Where format and ordering guarantees stop

Exact lines and canonical characters
Accept 26 ASCII Crockford Base32 characters, ignoring letter case only. Blank lines, spaces, quotes, hyphens and I/L/O/U fail. Values normalize to uppercase; aliases are not repaired and duplicate lines are kept.
Unsigned 48-bit milliseconds
The time range is 0–281474976710655, inclusive. The first encoded character must be 0–7. Dates in the far future remain valid format values; a decodable timestamp does not establish when a record was created.
Monotonicity is local to one call
The first tail is random and subsequent tails advance by one. An eighty-bit overflow rejects the whole batch; the clock does not advance to hide it. Separate clicks, tabs and machines share no generator state.
An identifier is not a credential
ULID and UUID both fit in 128 bits but have different text and field layouts. This page neither converts to a UUID version nor checks record existence. Time is readable and monotonic neighbours are predictable, so IDs are unsuitable as passwords or access tokens.
Explicit input and output budgets
Generation stops at 1,000 IDs; decoding stops at 1,000 physical lines or 100,000 UTF-16 code units. No file or URL import, SQL wrapper, deduplication or input rewrite is performed. Sorting changes only the report.

ULID generator questions

Are ULIDs sortable?

Canonical uppercase strings sort by embedded millisecond using ASCII order. Within one millisecond, independent random tails need not follow creation order. Enable monotonic mode for a strictly increasing sequence within this one batch; distributed clocks still require separate coordination.

What is the difference between ULID and UUID?

A ULID has 26 Crockford Base32 characters and a 48-bit millisecond prefix. A UUID has a versioned layout and commonly uses 36-character hexadecimal text. Equal storage width does not make ULID text valid UUID text or imply a particular UUID version.

What does monotonic actually mean here?

The ULID generator draws one random tail and increments it for later IDs in the same batch. Every new generation action starts independently. It does not remember a previous batch or correct a backwards clock across clicks.

How likely is a collision?

For independently random IDs sharing a timestamp, the random space is 2^80 and collisions are possible. Monotonic tails are distinct inside one successful batch. Neither mechanism guarantees global uniqueness across independent generators; enforce uniqueness where your data requires it.

What does the first part of a ULID represent?

The first ten characters encode the Unix millisecond time in 48 bits; the first character uses only three significant bits. This timestamp can be chosen by the generator, so recovering it is not proof of an actual insertion or event time.

Have a question about an ID?

Try the ULID generator

Use the ULID generator with a fixed test time, then decode a shuffled sample to compare timestamp order and original line positions before exporting.