- это должна быть уникальная строка;
- длина строки должна быть 8 символов;
- она должна содержать 2 цифры;
- все символы (не-цифровые символы) - должны быть в верхнем регистре.
При условии:
- требования № 2 и № 3 являются точными (ровно 8 символов, ровно 2 цифры)а не минимум
- "символы" в требовании # 4 - это 26 заглавных букв от A до Z
- , которые вы хотели бы равномерно распределить случайную строку
Тогда ваш предложенный метод имеет две проблемы.Одна состоит в том, что буквы A - Z являются ASCII 65 - 90, а не 64 - 89. Другая заключается в том, что она не распределяет числа равномерно в пределах возможного пространства строк.Это можно исправить, выполнив следующие действия:
- Создайте два разных целых числа от 0 до 7 и отсортируйте их.
- Создайте 2 случайных числа от 0 до 9.
- Генерируйте 6 случайных букв от A до Z.
- Используйте два разных целых числа на шаге 1 в качестве позиций и поместите 2 числа в эти позиции.
- Поместите 6 случайных букв воставшиеся позиции.
Существует 28 возможностей для двух разных целых чисел ((8 * 8 - 8 дубликатов) / 2 порядка), 26 6 возможностей для букв и100 возможностей для чисел, общее число допустимых комбинаций N гребень = 864964172800 = 8,64 x 10 11 .
edit: Если вы хотите избежать хранения базы данных, но по-прежнему гарантируете уникальность строк и , если они будут криптографически безопасны, лучше всего использовать криптографическую случайную биекцию со счетчика между 0 и N макс <= N <sub>comb к подмножеству пространства возможных выходных строк.( Bijection означает, что между выходной строкой и входным счетчиком есть взаимно-однозначное соответствие.)
Это возможно с сетями Фейстеля , которые обычноиспользуется в хеш-функциях и симметричной криптографии (включая AES).Возможно, вы захотите выбрать N max = 2 39 , что является наибольшей мощностью 2 <= N <sub>comb , и использовать 39-битную сеть Feistel., используя постоянный ключ, вы держите в секрете.Затем вы подключаете свой счетчик к сети Feistel, и появляется еще одно 39-разрядное число X, которое затем преобразуется в соответствующую строку следующим образом:
- Повторите следующий шаг 6 раз:
- Возьмите X mod 26, сгенерируйте заглавную букву и установите X = X / 26.
- Возьмите X mod 100, чтобы сгенерировать две цифры, и установите X = X / 100.
- X теперь будет от 0 до 17 включительно (2 39 / 26 6 / 100 = 17,796 ...).Сопоставьте это число с двумя позициями уникальных цифр (вероятно, проще всего с помощью таблицы поиска, поскольку мы говорим только о 28 возможностях. Если у вас было больше, используйте алгоритм Флойда для генерации уникальной перестановки и используйте переменную-базовый метод mod + целочисленное деление вместо генерации случайного числа).
- Следуйте приведенному выше случайному подходу, но вместо этого используйте числа, сгенерированные этим алгоритмом.-битные числа, и если выход вашей сети Feistel> N comb , то увеличьте счетчик и попробуйте снова.Это покрывает все строковое пространство за счет отклонения недопустимых чисел и необходимости повторного выполнения алгоритма.(Но вам не нужна база данных, чтобы сделать это.)
Но это не то, к чему можно обратиться, если вы не знаете, что делаете.