Старайтесь избегать проверок, следя за тем, чтобы вы всегда выбирали уникальный номер:
static char[] base9 = "123456789".ToCharArray();
static string ConvertToBase9(int value) {
int num = 9;
char[] result = new char[9];
for (int i = 8; i >= 0; --i) {
result[i] = base9[value % num];
value = value / num;
}
return new string(result);
}
public static void generateIdentifiers(int quantity) {
var uniqueIdentifiers = new List<string>(quantity);
// we have 387420489 (9^9) possible numbers of 9 digits in base 9.
// if we choose a number that is prime to that we can easily get always
// unique numbers
Random random = new Random();
int inc = 386000000;
int seed = random.Next(0, 387420489);
while (uniqueIdentifiers.Count < quantity) {
uniqueIdentifiers.Add(ConvertToBase9(seed));
seed += inc;
seed %= 387420489;
}
}
Я постараюсь объяснить идею маленькими цифрами ...
Предположим, у вас естьмаксимум 7 возможных комбинаций.Мы выбираем число, простое к 7, например, 3, и случайное начальное число, например, 4.
В каждом раунде мы добавляем 3 к нашему текущему числу, а затем берем результат по модулю 7, поэтомуполучаем следующую последовательность:
4 -> 4 + 3% 7 = 0
0 -> 0 + 3% 7 = 3
3 -> 3 + 3% 7 = 6
6 -> 6 + 6% 7 = 5
Таким образом, мы генерируем все значения от 0 до 6 непоследовательным образом.В моем примере мы делаем то же самое, но у нас есть 9 ^ 9 возможных комбинаций, и в качестве простого числа к этому я выбираю 386000000 (вам просто нужно избегать кратных 3).
Затем я выбираючисло в последовательности и я преобразую его в основание 9.
Надеюсь, это понятно:)
Я проверил его на своей машине, и генерация уникальных значений 400 КБ заняла ~ 1 секунду.