На всякий случай, если кто-то, заскочивший через Google, ищет небольшую служебную библиотеку, ShortId (https://www.npmjs.com/package/shortid) отвечает всем требованиям этого вопроса. Он позволяет указывать разрешенные символы и длину и гарантирует непоследовательные, неповторяющиеся строки.
Чтобы сделать это более реальным ответом, ядро этой библиотеки использует следующую логику для создания своих коротких идентификаторов:
function encode(lookup, number) {
var loopCounter = 0;
var done;
var str = '';
while (!done) {
str = str + lookup( ( (number >> (4 * loopCounter)) & 0x0f ) | randomByte() );
done = number < (Math.pow(16, loopCounter + 1 ) );
loopCounter++;
}
return str;
}
/** Generates the short id */
function generate() {
var str = '';
var seconds = Math.floor((Date.now() - REDUCE_TIME) * 0.001);
if (seconds === previousSeconds) {
counter++;
} else {
counter = 0;
previousSeconds = seconds;
}
str = str + encode(alphabet.lookup, version);
str = str + encode(alphabet.lookup, clusterWorkerId);
if (counter > 0) {
str = str + encode(alphabet.lookup, counter);
}
str = str + encode(alphabet.lookup, seconds);
return str;
}
Я не редактировал это, чтобы отразить только самые основные части этого подхода, поэтому приведенный выше код включает некоторую дополнительную логику из библиотеки. Если вам интересно все, что он делает, посмотрите на источник: https://github.com/dylang/shortid/tree/master/lib