- это должна быть уникальная строка;
- длина строки должна быть 8 символов;
- должно содержать 2 цифры;
- все символы (нецифровые символы) - должны быть в верхнем регистре.
Предполагая:
- требования # 2 и # 3 точно (ровно 8 символов, ровно 2 цифры), а не минимум
- в "символы", в требовании # 4 являются 26 заглавные буквы от А до Z
- вы хотели бы равномерно распределенную случайную строку
Тогда ваш предлагать d имеет два вопроса. Во-первых, буквы A - Z являются ASCII 65 - 90, а не 64 - 89. Другим является то, что он не равномерно распределяет числа в пределах возможного пространства строк. Это можно исправить следующим образом:
- Создайте два разных целых числа от 0 до 7 и отсортируйте их.
- Сформировать 2 случайных чисел от 0 до 9.
- Сформировать 6 случайных букв от А до Я.
- Используйте два различных числа в шаге 1 в позиции, и поставить 2 номера в этих позициях.
- Поместите 6 случайных букв в оставшиеся позиции.
Есть 28 возможностей для двух различных целых чисел ((8 * 8 - 8 дублирует)/2 Упорядочения), 26 возможности для писем и 100 возможности для чисел, общее кол-во в силе комбинации: N гребенка = 864964172800 = 8,64 x 10 .
редактировать: Если вы хотите, чтобы избежать баз данных для хранения, но по-прежнему гарантировать как уникальность строк и у них криптографический безопасные, лучше всего это криптографический случайная биекция из счетчика между 0 и N max < = N гребенка подмножество пространства возможных выходных строк. (Bijection означает, что между выходной строкой и входным счетчиком существует взаимно однозначное соответствие.)
Это возможно с помощью Feistel networks, которые обычно используются в хэш-функциях и симметричной криптографии (включая AES). Вы, вероятно, хотите, чтобы выбрать N макс = 2 что наибольшая степень 2 < = N гребнем и использовать 39-битную Фейстеля сети с использованием постоянного ключа вы держите в секрете. Затем вы подключите счетчик к сети Фейстеля, и прибывает еще 39-разрядное число X, который затем преобразовать в соответствующую строку следующим образом:
- Повторите следующий шаг 6 раз:
- Take X mod 26, сгенерируйте заглавную букву и установите X = X/26.
- Возьмите X mod 100, чтобы сгенерировать две цифры, и установите X = X/100.
- X теперь будет между 0 и 17 включительно (2 /26 /100 = 17.796 ...). Сопоставьте это число с двумя уникальными позициями цифр (возможно, проще всего использовать таблицу поиска, поскольку мы говорим только о 28 вариантах. Если у вас было больше, используйте Floyd's algorithm for generating a unique permutation и используйте технику с переменной базой mod + integer divide вместо генерации случайного номер).
- Следуйте случайному подходу выше, но вместо этого используйте числа, сгенерированные этим алгоритмом.
В качестве альтернативы, использовать 40-разрядные числа, и если выход из вашей сети криптографической является> N гребень, то увеличивает счетчик и повторите попытку. Это охватывает все пространство строки за счет отказа от недопустимых чисел и необходимости повторного выполнения алгоритма. (Но для этого вам не нужна база данных.)
Но это не то, что нужно, если вы не знаете, что делаете.
Для начала вам нужно выяснить, сколько возможностей вы получаете от этих комбинаций. – leppie
Значения в БД ... они также следуют этому шаблону? Вы знаете форум, который их создал? Можете ли вы найти шаблон в строках в базе данных? Если нет, у вас всегда будет риск столкновения ... – FrustratedWithFormsDesigner
Зачем вам нужна случайность? Почему вы не можете использовать последовательные строки? –