Generating prefixed base62 encoded UUIDs in ReScript
module Base62 = {
let alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
let alphabetLength = alphabet->String.length->BigInt.fromInt
let base62UUIDLength = 22
let rec encode = number => {
if number < alphabetLength {
alphabet->String.getUnsafe(number->BigInt.toInt)
} else {
open! BigInt
encode(number / alphabetLength) ++ encode(BigInt.mod(number, alphabetLength))
}
}
let bigIntFromHexExn = string => BigInt.fromStringExn(`0x${string}`)
let encodeUUID = uuid => {
uuid
->String.replaceAll("-", "")
->bigIntFromHexExn
->encode
->String.padStart(base62UUIDLength, "0")
}
}
module Browser = {
module Crypto = {
@val @scope("crypto")
external randomUUID: unit => string = "randomUUID"
}
}
let generate = (~prefix) => {
let uuid = Browser.Crypto.randomUUID()
`${prefix}_${uuid->Base62.encodeUUID}`
}