Подтвердить что ты не робот

Как создать 63 миллиона кодов выигрышей

Я пытаюсь придумать "умный" и "безопасный" способ создания около 63 миллионов уникальных кодов, которые будут использоваться в конкурсе. Коды будут содержать около 10 символов.

Кто-нибудь сделал что-либо подобное или знал о каких-либо "препятствиях", которые могут возникнуть из-за этих проблем? Как мы минимизируем вероятность того, что кто-то сможет угадать коды?

Этот проект будет выполнен в PHP, но это не имеет особого значения, это скорее логика, проблема здесь.

Любая обратная связь будет действительно оценена.

UPDATE Просто, чтобы прояснить, будет 10 символов нечувствительных к регистру альфа-числовых значений. A-Z0-9

4b9b3361

Ответ 1

Синтаксис

Вероятно, у вас будут люди, которые копируют эти коды, поэтому это означает, что эти коды должны быть легко скопированы. 10 ^ 10 слишком мал, как указывает Гамкеат. kgiannakakis имеет лучшую идею, но это вызывает еще одну проблему: "1" очень похож на "я". "0", "C", "O" и "Q" также весьма схожи. Это не большая проблема. Определите безопасный альфабет: "0123456789ABDEFGHJKLMNPRSTUVXYZ" (не содержит COIQ). Из комментариев: в зависимости от выбранных шрифтов 5/S и U/V также могут быть визуально неоднозначными; при необходимости замените. Это 32-символьный (5-битный) код. 10-символьный код - это 50-битный номер. Это должно быть довольно тривиально, чтобы генерировать, сортировать, копировать, сравнивать и т.д. Шансы быть угадываемыми примерно равны 0,63E-7

Так как коды слишком длинны, чтобы запоминать, пользователям потребуется точка покоя при их копировании. Поэтому разделите строку на две или три части и убедитесь, что поле ввода соответствует этому пробою.

например. AKG3L-45TEE = > две группы по 5, и даже если вы не можете вспомнить 5 символов, намного легче найти точку, где вы перестали читать.


Как сгенерировать их:

Это довольно просто. Вам не нужен особенно сложный алгоритм для создания кандидатов. Вы можете сгенерировать 10 случайных чисел на каждый необходимый код, взять 5 бит от каждого номера (обычно средние биты лучше всего, например (rand()/64) по модулю 32). Используйте это значение [0-31] как индекс в своем алфавите. Создайте таблицу базы данных с этой строкой в ​​качестве первичного ключа и вставьте до тех пор, пока в таблице не будет 63 миллиона записей. Вероятно, вы захотите добавить в эту таблицу даты "сгенерированы" и "выкупить".

Ответ 2

Если вы правильно поняли, вы хотите создать 63 миллионных кода из 10 цифр с низким "коэффициентом догадки".

Существует 10 000 000 000 действительных комбинаций. Из этих 63 000 000 номеров цен. 63/10000 = 0,0063. Таким образом, каждая догадка имеет 0,63% шансов на успех. Звучит не очень высоко, но с грубой силой цифры довольно легко получить.

Вы уверены, что соотношение 63 на 10000 достаточно хорошее?

Ответ 3

Создайте набор действительно случайных, уникальных 64-битных чисел в диапазоне 0 - 2 50 -1. Вам нужно будет отслеживать те, которые вы видели, и отклонять дубликаты. Используйте каждые 5 бит младших 50 бит этого числа, вытаскивая из 32-символьного алфавита - в основном все буквы в английском алфавите (верхнем или нижнем регистре) минус L и O плюс цифры 2-9 (это уменьшает путаницу между l/1 и 0/O). Для 63 миллионов кодов это даст вам вероятность 0,000006% (63 000 000/2 50) случайного выбора правильной кодовой последовательности.

Я также сделал это, используя автогенерированный первичный ключ (int) и бит-чередование с 32-разрядным случайным значением. В этом случае я использовал полные 64 бита для генерации 13 символов из алфавита и добавил два случайных символа в фиксированных положениях для 15-символьного кода. При искуплении кода вы отменяете алгоритм для извлечения ключа и случайности, отбрасывая два лишних случайных символа, затем сравнивайте случайность с найденным, хранящимся с ключом, для проверки кода.

Ответ 4

Будьте осторожны при использовании буквенно-цифровых символов для кодов, так как вы не хотите случайно генерировать что-то запутанное или смущающее. Чтобы избежать путаницы, я предлагаю удалить 1 и L, 0 и O и, возможно, 8 и B. Чтобы избежать смущения, подумайте о том, чтобы удалить все гласные, чтобы вы не могли случайно записать что-либо (используйте свое воображение здесь).

Ответ 5

Смотрите ссылка для генерации буквенно-цифровых строк в PHP. Он использует алфавит из 36 символов, который должен быть достаточно безопасным. Однако уникальность не гарантируется. Думаю, вы могли бы использовать Set для реализации этого. Поскольку это одноразовая операция, временная задержка для тестирования дубликатов не должна быть большой проблемой.

Ответ 6

Используйте защищенный генератор случайных чисел.

Ответ 7

если они предназначены для уникальных участников, вы можете хэш каждого имени участников (и/или), а затем отрезать до первых 10 символов.

Ответ 8

Возможно, это поможет вам немного: Универсальный уникальный идентификатор

Цель UUID - включить распределенных систем однозначно идентифицировать информацию без значительная центральная координация. Таким образом, каждый может создать UUID и использовать это определить что-то с разумную уверенность в том, что идентификатор никогда не будет непреднамеренно используется кем-либо для ничего другого.

Ответ 9

Вы говорите, что коды длиннее 10 символов, но каков ваш набор символов?

Если это просто цифры, то (@Gamecat), вероятно, будет слишком легко случайным образом угадать код.

С другой стороны, если набор символов - буквы + цифры, то у вас есть много безопасности.

В любом случае сгенерируйте генератор случайных чисел и проверьте наличие дубликатов перед вставкой в ​​базу данных.