См. @ ответ Мохамеда для предварительно упакованного решения (пакет shortid
). Предпочитайте это вместо любых других решений на этой странице, если у вас нет особых требований.
Буквенно-цифровая последовательность из 6 символов достаточно хороша, чтобы случайным образом индексировать коллекцию в 10 000 (36 6 = 2,2 миллиарда и 36 3 = 46656).
function generateUID() {
// I generate the UID from two parts here
// to ensure the random number provide enough bits.
var firstPart = (Math.random() * 46656) | 0;
var secondPart = (Math.random() * 46656) | 0;
firstPart = ("000" + firstPart.toString(36)).slice(-3);
secondPart = ("000" + secondPart.toString(36)).slice(-3);
return firstPart + secondPart;
}
UID, сгенерированные случайным образом, будут конфликтовать после генерации чисел ~ & radic; N (парадокс дня рождения), поэтому для безопасной генерации без проверки требуется 6 цифр (старая версия генерирует только 4 цифры, которые будут иметь коллизию после 1300 ID, если вы не проверю).
Если вы выполняете проверку столкновений, количество цифр можно уменьшить на 3 или 4, но учтите, что производительность будет уменьшаться линейно, когда вы генерируете все больше и больше UID.
var _generatedUIDs = {};
function generateUIDWithCollisionChecking() {
while (true) {
var uid = ("0000" + ((Math.random() * Math.pow(36, 4)) | 0).toString(36)).slice(-4);
if (!_generatedUIDs.hasOwnProperty(uid)) {
_generatedUIDs[uid] = true;
return uid;
}
}
}
Подумайте об использовании последовательного генератора (например, user134_item1
, user134_item2
,…), если вам нужна уникальность, а не непредсказуемость. Вы можете «хэшировать» последовательно сгенерированную строку, чтобы восстановить непредсказуемость.
UID, сгенерированные с использованием Math.random
, небезопасны (и вы все равно не должны доверять клиенту). не полагайтесь на его уникальность или непредсказуемость в критически важных задачах.