UXID

UXIDs are identifiers which:

  • Describe the resource (aid in debugging and investigation)
  • Use Crockford encoding (work well with humans)
    • Compact - hard to manipulate or read long strings of characters
    • Prononounceable - easily and accurately transmit characters to another human using a telephone
  • Work well with copy and paste (double clicking selects the entire ID)
  • Can be shortened for low cardinality resources
  • Are very unlikely to collide (more likely with less randomness)
  • Are secure against enumeration attacks
  • Can be generated by application code (not tied to the datastore)
  • Are K-sortable (lexicographically sortable by time - works well with datastore indexing)
  • Do not require any coordination (human or automated) at startup, or generation

Many of the concepts of Stripe IDs have been used in this library.

Usage

# No options generates a basic ULID
UXID.generate! # "01EMDGJF0DQXQJ8FM78XE97Y3H"

# A prefix can be provided
UXID.generate! prefix: "cus" # "cus_01EMDGJF0DQXQJ8FM78XE97Y3H"

# The amount of randomness can be decreased for smaller cardinality resources
UXID.generate! prefix: "cus", rand_size: 4 # "cus_01EMDGN5QAGPWSKN2"

Installation

The package can be installed by adding uxid to your list of dependencies in mix.exs:

def deps do
  [
    {:uxid, "~> 0.0.6"}
  ]
end

Documentation can be generated with ExDoc and published on HexDocs. Once published, the docs can be found at https://hexdocs.pm/uxid.