lazyid
Version:
Minimal 16-character URL-safe unique ID generator based on a millisecond timestamp, encoded in Base36.
22 lines (17 loc) • 684 B
JavaScript
import { randomBytes } from 'crypto';
const TIME_LENGTH = 8;
const TOTAL_LENGTH = 16;
const BASE = 36;
const BIGINT_BASE = BigInt(BASE);
const TIME_MODULO = BIGINT_BASE ** BigInt(TIME_LENGTH);
const RANDOM_BYTES_NEEDED = 6;
export default function lazyid(id) {
if (id) {
const timePart = id.substring(0, TIME_LENGTH);
return parseInt(timePart, BASE);
}
const timeComponent = BigInt(Date.now()) % TIME_MODULO;
const randomComponent = BigInt('0x' + randomBytes(RANDOM_BYTES_NEEDED).toString('hex')) % TIME_MODULO;
const combined = (timeComponent * TIME_MODULO) + randomComponent;
return combined.toString(BASE).padStart(TOTAL_LENGTH, '0');
}