2014-10-15 2 views
0

Были разные вопросы о генерации случайных чисел, но я не видел того, что могло бы решить конкретную проблему, которую я пытаюсь решить.Создание уникальных и узнаваемых наборов чисел

Мои требования:

  • Мне нужно, чтобы иметь возможность создать набор 5000 номеров, каждый из которых число составляет 10 цифр длинные
  • чисел в этом наборе должны быть случайными (или достаточно случайным образом не легко догадаться)
  • числа в этом наборе должны быть уникальными
  • Там нет необходимости для того, в набор элементов
  • Моя программа должна быть в состоянии признать, что ряд был сгенерирован USI Этот алгоритм. Члены набора не сохраняются (но семя или некоторый параметр, используемый для их построения, может быть).
  • Процесс должен быть повторяемым. Наборы 5000 номеров будут генерироваться в разное время. Один и тот же номер CAN может отображаться в разных наборах, но алгоритм их генерации не должен быть легко воспроизводимым/узнаваемым. (Например, если у меня есть набор из 5000 номеров, я не могу легко определить, какой будет набор чисел в другом наборе из 5000.)

Есть ли способ сделать это? Любая помощь или предложения, где смотреть, будут оценены. (Это будет реализовано в PHP, но я просто ищу алгоритм для этого.)

+0

Ничего пока, я в процессе выяснения, что делать. У меня были некоторые идеи, но ничего, что было довольным. – janman05

ответ

0

Возьмите целочисленный счетчик и зашифруйте его с использованием схемы шифрования от 10 цифр до 10 цифр.

Счетчик будет работать от 0 до 4999. Чтобы проверить подлинность номера, просто проверьте после дешифрования, что цифры высокого порядка - это нули. (Вероятность того, что вы сформируете действительный код «случайно», составляет более двух миллионов.)

Чтобы определить несколько наборов, вы можете позволить счетчику работать с более высокими значениями или использовать другой ключ шифрования.

+0

Хм, неплохая идея. Если ключ шифрования изменяется от установленного к набору, что гарантирует, что значения не будут повторяться. Я дам ему попробовать и посмотрю, работает ли он. Любые предложения по использованию схемы шифрования? – janman05

+0

Я не специалист. Взгляните на http://stackoverflow.com/questions/959916/way-to-encrypt-a-single-int –

0

Простой способ сделать то, о чем вы просите, это иметь процедуру для принятия номера и сопоставления его чему-то легко проверяемый. Например, вы можете решить, чтобы числа делились на 1009. Так что просто генерируйте случайные числа, затем округлите их до ближайшего, делимого на 1009. Или вы можете сгенерировать 6-значные числа, а затем использовать алгоритм хэширования для генерации еще 4 цифр.

ЕСЛИ вы знаете правило, легко убедиться, что число соответствует ему. Вы найдете несколько ложных срабатываний. И это образец, который не будет легко найти случайно.

Но имейте в виду. «Не будет легко найти случайно», это не то же самое, что «будет сопротивляться серьезным попыткам сломать его». Если вам нужно что-то безопасное, это не так.

+0

У меня не может быть ложных срабатываний, мне абсолютно нужна гарантия того, что номер появится один раз только в наборе. (И да, я не смотрю что-то совершенно неуловимое.) – janman05

Смежные вопросы