Проблема с ответами на «Мне нужны случайные строки» вопросов (на любом языке) - практически каждое решение использует некорректную первичную спецификацию длина строки . Сами вопросы редко показывают, зачем нужны случайные строки, но я бы сказал, что вам редко нужны случайные строки длиной, скажем, 8. Что вам обязательно нужно, так это, например, некоторое количество уникальных строк , чтобы использовать их как идентификаторы для некоторых целей.
Существует два основных способа получения строго уникальных строк: детерминистически (что не случайно) и сохранение / сравнение (что обременительно). Что мы делаем? Мы отдаем призрак. Вместо этого мы используем вероятностную уникальность . То есть мы признаем, что существует некоторый (хотя и небольшой) риск того, что наши строки не будут уникальными. Здесь полезно знать вероятность столкновения и энтропия .
Так что я перефразирую неизменную потребность как нужное количество строк с небольшим риском повторения. В качестве конкретного примера предположим, что вы хотите создать 5 миллионов идентификаторов. Вы не хотите хранить и сравнивать каждую новую строку, и вы хотите, чтобы они были случайными, поэтому вы принимаете некоторый риск повторения. Например, допустим, что риск повторения меньше 1 в триллионе. Так какая длина строки вам нужна? Ну, этот вопрос недостаточно конкретизирован, поскольку зависит от используемых символов. Но что более важно, это ошибочно. Вам нужно указать энтропию строк, а не их длину. Энтропия может быть напрямую связана с вероятностью повторения в некотором количестве строк. Длина строки не может.
И здесь может помочь библиотека типа EntropyString . Чтобы сгенерировать случайные идентификаторы с шансом повторения менее 1 на триллион в 5 миллионах строк, используйте entropy-string
:
import {Random, Entropy} from 'entropy-string'
const random = new Random()
const bits = Entropy.bits(5e6, 1e12)
const string = random.string(bits)
"44hTNghjNHGGRHqH9"
entropy-string
использует набор символов из 32 символов по умолчанию. Существуют и другие предопределенные наборы символов, и вы также можете указать свои собственные символы. Например, генерация идентификаторов с той же энтропией, что и выше, но с использованием шестнадцатеричных символов:
import {Random, Entropy, charSet16} from './entropy-string'
const random = new Random(charSet16)
const bits = Entropy.bits(5e6, 1e12)
const string = random.string(bits)
"27b33372ade513715481f"
Обратите внимание на разницу в длине строки из-за разницы в общем количестве символов в используемом наборе символов. Риск повторения в указанном количестве потенциальных строк одинаков. Длина строки не. И, что лучше всего, риск повторения и потенциальное количество строк явно. Больше не нужно гадать с длиной строки.