glecuid

Release Test Package Hex Docs

This is a port of paralleldrive/cuid2@v3.0.0 in Gleam that works on all target. For more detailed information about Cuid2, please refer to the original documentation.

Cuid2

Secure, collision-resistant ids optimized for horizontal scaling and performance. Next generation UUIDs.

Need unique ids in your app? Forget UUIDs and GUIDs which often collide in large apps. Use Cuid2, instead.

Cuid2 is:

Cuid2 is not good for:

Usage

Add to your Gleam project:

gleam add glecuid

Generate some ids:

import glecuid/cuid2

pub fn main() {
  cuid2.create_id()
  // -> "avu4793cnw6ljhov1s7Oxidg"

  cuid2.new()
  |> cuid2.with_length(10)
  |> cuid2.generate()
  // -> "av77nekw5e"
}

Configuration

import glecuid/cuid2

pub fn main() {
  // The new function returns a default generator that can be modified.
  let generator = cuid2.new()
  // Customize the length of the id.
  |> cuid2.with_length(10)
  // A custom fingerprint for the host environtment.
  // This is used to help prevent collisions when generating ids in a
  // distributed system.
  |> cuid2.with_fingerprint("my_machine")
  // A custom counter.
  // This is used to help prevent collisions when generating ids in
  // the same millisecond.
  |> cuid2.with_counter(fn() { 67 })
  // A custom randomizer with the same API as float.random.
  |> cuid2.with_randomizer(fn() { 0.42 })

  cuid2.generate(generator)
  // -> "av77nekw5e"
}

Validation

import glecuid/cuid2

pub fn main() {
  cuid2.is_cuid(cuid2.create_id())
  // -> "TRUE"

  cuid2.is_cuid("not a cuid")
  // -> "FALSE"
}

View usage in the documentation at https://hexdocs.pm/glecuid.

Implementation Detail

Cuid2 is made up of the following entropy sources:

Pseudorandom value

Uses float.random by default.

Session counter

In erlang target, this is implemented using counters with the reference stored in persistent_term.

If you don’t wish to use the global counter, avoid using create_id and provide a custom counter when using generate. The global counter will not be created if you never use it.

import glecuid/cuid2

pub fn main() {
  cuid2.new()
  |> cuid2.with_random_counter()
  |> cuid2.generate()
  // -> "avu4793cnw6ljhov1s7Oxidg"
}

Host fingerprint

In erlang target this is the Pid of the current process.

Search Document