GitHub - haskell-github-trust/ulid: Haskell implementation of ULIDs (Unique Lexicographically Sortable Identifiers) (original) (raw)

Lexicographically sortable, 128-bit identifier with 48-bit timestamp and 80 random bits. Canonically encoded as a 26 character string, as opposed to the 36 character UUID.

Original implementation and spec: github.com/alizain/ulid

01an4z07by 79ka1307sr9x4mv3

|----------| |----------------| Timestamp Randomness 48 bits 80 bits

Universally Unique Lexicographically Sortable Identifier

UUID can be suboptimal for many uses-cases because:

Instead, herein is proposed ULID:

Known Issues

Usage

A simple usage example:

module Main where

import Data.ULID

main :: IO () main = do -- Derive a ULID using the current time and default random number generator ulid1 <- getULID print ulid1

-- Derive a ULID using a specified time and default random number generator ulid2 <- getULIDTime 1469918176.385 -- POSIX Time, millisecond precision print ulid2

As per the spec, it is also possible to use a cryptographically-secure random number generator to contribute the randomness. However, the programmer must manage the generator on their own.

Example:

module Main where

import Data.ULID

import qualified Crypto.Random as CR import qualified Data.ULID.Random as UR import qualified Data.ULID.TimeStamp as TS

main :: IO () main = do g <- (CR.newGenIO :: IO CR.SystemRandom)

-- Generate timestamp from current time t <- TS.getULIDTimeStamp

let ulid3 = case UR.mkCryptoULIDRandom g of Left err -> error $ show err -- Use g2, …, to continue generating secure ULIDs Right (rnd, g2) -> ULID t rnd

print ulid3

Test Suite

Performance

Running 1 benchmarks... Benchmark ulid-bench: RUNNING... 217,868 op/s generate Benchmark ulid-bench: FINISH