locutus
Version:
Locutus other languages' standard libraries to JavaScript for fun and educational purposes
44 lines (43 loc) • 1.93 kB
JavaScript
import { getPhpRuntimeNumber, setPhpRuntimeEntry } from "../_helpers/_phpRuntimeState.js";
export function uniqid(prefix, moreEntropy) {
// discuss at: https://locutus.io/php/uniqid/
// original by: Kevin van Zonneveld (https://kvz.io)
// revised by: Kankrelune (https://www.webfaktory.info/)
// note 1: Uses an internal counter (in locutus global) to avoid collision
// example 1: var $id = uniqid()
// example 1: var $result = $id.length === 13
// returns 1: true
// example 2: var $id = uniqid('foo')
// example 2: var $result = $id.length === (13 + 'foo'.length)
// returns 2: true
// example 3: var $id = uniqid('bar', true)
// example 3: var $result = $id.length === (23 + 'bar'.length)
// returns 3: true
const normalizedPrefix = prefix ?? '';
let retId = '';
const formatSeed = (seed, reqWidth) => {
const hexSeed = Number.parseInt(String(seed), 10).toString(16); // to hex str
if (reqWidth < hexSeed.length) {
// so long we split
return hexSeed.slice(hexSeed.length - reqWidth);
}
if (reqWidth > hexSeed.length) {
// so short we pad
return new Array(1 + (reqWidth - hexSeed.length)).join('0') + hexSeed;
}
return hexSeed;
};
let uniqidSeed = getPhpRuntimeNumber('uniqidSeed', Math.floor(Math.random() * 0x75bcd15)); // init seed with big random int
uniqidSeed++;
setPhpRuntimeEntry('uniqidSeed', uniqidSeed);
// start with prefix, add current milliseconds hex string
retId = normalizedPrefix;
retId += formatSeed(Number.parseInt(String(new Date().getTime() / 1000), 10), 8);
// add seed hex string
retId += formatSeed(uniqidSeed, 5);
if (moreEntropy) {
// for more entropy we add a float lower to 10
retId += (Math.random() * 10).toFixed(8).toString();
}
return retId;
}