Я столкнулся со следующей проблемой: сгенерировать N уникальных буквенно-цифровых строк из ограниченного алфавита.Вот мое решение в C #:
string Alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
Random generator = new Random();
const int ToGenerate = 10000;
const int CharactersCount = 4;
ArrayList generatedStrings = new ArrayList();
while( generatedStrings.Count < ToGenerate ) {
string newString = "Prefix";
for( int i = 0; i < CharactersCount; i++ ) {
int index = generator.Next( Alphabet.Length );
char character = Alphabet[index];
newString += character;
}
if( !generatedStrings.Contains( newString ) ) {
generatedStrings.Add( newString );
}
}
for( int i = 0; i < generatedStrings.Count; i++ ) {
System.Console.Out.WriteLine( generatedStrings[i] );
}
, оно генерирует строки по 10 КБ, начинающиеся с «Префикса» и в противном случае состоящие из заглавных букв и цифр.Вывод выглядит хорошо.
Теперь я вижу следующую проблему.Созданные строки предназначены для сценария, в котором они вряд ли могут быть предсказаны кем-либо.В моей программе семя зависит от времени.Когда кто-то знает начальное значение, он может запустить тот же код и получить точно такие же строки.Если он знает какие-либо две строки, он может легко выяснить мой алгоритм (поскольку он действительно наивен) и попытаться перебором начального значения - просто перечислить все возможные начальные значения, пока он не увидит две известные строки в выводе.
Могут ли быть внесены некоторые простые изменения в мой код, чтобы сделать описанную атаку менее вероятной?