Несколько месяцев назад мне было поручено реализовать уникальный и случайный код для нашего веб-приложения. Код должен быть удобным для пользователя и настолько маленьким, насколько это возможно, но все же по существу быть случайным (поэтому пользователи не могли легко предсказать следующий код в последовательности).
В итоге получились значения, которые выглядели примерно так:
Af3nT5Xf2
К сожалению, я никогда не был доволен реализацией. О гидах не могло быть и речи, они были просто слишком большими и трудными для ввода пользователями. Я надеялся на что-то более похожее на 4 или 5 символов / цифр, но наша конкретная реализация будет генерировать заметно паттерны последовательностей, если мы закодируем в менее 9 символов.
Вот что мы в итоге сделали:
Мы извлекли уникальный последовательный 32-битный идентификатор из базы данных. Затем мы вставили его в центральные биты 64-битного случайного числа. Мы создали таблицу поиска легко набираемых и распознаваемых символов (A-Z, a-z, 2-9, пропуская легко перепутанные символы, такие как L, l, 1, O, 0 и т. Д.). Наконец, мы использовали эту таблицу поиска для кодирования base-54 64-разрядного целого числа. Старшие биты были случайными, младшие биты были случайными, но центральные биты были последовательными.
Конечным результатом был код, который был намного меньше, чем guid, и выглядел случайным, даже если это абсолютно не так.
Я никогда не был удовлетворен этой конкретной реализацией. Что бы вы, ребята, сделали?