Generate CUID
A 25-character lowercase identifier starting with “c”, composed of a base36 timestamp, a session counter, a generator fingerprint, and a random suffix — the original collision-resistant ID format from Parallel Drive.
Generated · 0 IDs
Options
This ID
Collision
Within one tab the counter prevents same-millisecond repeats. Across tabs, a collision needs the same millisecond plus a matching fingerprint and random tail.
Validate and parse CUID
Paste an ID
About CUID
Use when: you maintain a system that already uses CUID v1.
Avoid when: this is a new project. CUID v1 has been deprecated by its author in favour of CUID2.
How it is generated
A CUID v1 is always 25 lowercase base36 characters, and it always starts with the letter "c" so it can never be parsed as a number.
After the "c" you get four concatenated fields: timestamp, session counter, generator fingerprint, and a random tail. The counter guards against same-millisecond collisions within one tab, and the fingerprint distinguishes browser sessions minting IDs at the same time.
The random tail comes from crypto.getRandomValues via rejection sampling; the generator fingerprint is also seeded from crypto.getRandomValues, shared within a batch and re-randomized on each Regenerate.
- 01 Start the output with the literal character "c".
- 02 Append Date.now().toString(36), left-padded with zeros to 8 characters.
- 03 Append the session counter as 4 base36 characters; increment afterwards, wrap at 36⁴ = 1,679,616.
- 04 Append the generator fingerprint as 4 base36 characters (from crypto.getRandomValues; shared within a batch and re-randomized on each Regenerate).
- 05 Append two independent 4-character base36 random blocks from crypto.getRandomValues.
- 06 Result is always 1 + 8 + 4 + 4 + 4 + 4 = 25 characters.
c kkrabb0o 0000 qzrm 3a2g3y8a (visual spaces for clarity; │ └──┬───┘ └─┬┘ └─┬┘ └──┬───┘ actual ID is 25 chars no spaces) │ │ │ │ └── 8 random base36 chars (two 4-char blocks) │ │ │ └──────── 4-char generator fingerprint (per batch, re-rolled on Regenerate) │ │ └───────────── 4-char session counter (++ per call, wraps at 36⁴) │ └───────────────────── 8-char Unix-ms timestamp in base36 └────────────────────────── literal "c" prefix Alphabet: 0-9 a-z (lowercase base36). Always exactly 25 chars.
All of this runs in your browser. Random bytes come from crypto.getRandomValues, timestamps come from the system clock, and nothing about the generated ID leaves the tab.