Здравствуйте. Есть скрипт, который посимвольно перебирает, ну, например, пароль: gen.class.phpКод | <? class CPasswordGenerator{ /** * @desc минимальная длина генерируемого пароля * @access private */ var $_minlen = 0; /** * @desc максимальная длина генерируемого пароля * @access private */ var $_maxlen = 0; /** * @desc символы, из которых должен состоять пароль * @access private */ var $_alphabet = ""; /** * @desc текущий вариант пароля * @access private */ var $_curPwd = ""; /** * @desc массив с числами, соответствующими буквам алфавита * @access private */ var $_curPwdAr = array();
/** * @desc текущая длина пароля * @access private */ var $_curPwdLen = 0; /** * @desc вариант последнего пароля при заданной длине и алфавите * @access private */ var $_lastPwd = ""; /** * @desc * @access private */ var $_index = 0; /** * @desc длина алфавита * @access private */ var $_alphaLen = 0;
/** * @desc длина алфавита минус один, чуток ускоряет генерацию * @access private */ var $_intAlphaLen = 0; /** * Конструктор * @access public * @param int минимальная длина пароля * @param int максимальная длина * @param string алфавит * @return void */ function CPasswordGenerator($minLength, $maxLength, $alphabet) { $this->_minlen = $minLength; $this->_maxlen = $maxLength; $this->_alphabet = $alphabet; $this->_alphaLen = strlen($this->_alphabet); $this->_intAlphaLen = $this->_alphaLen - 1; $this->_init($this->_minlen); } /** * Производит инициализацию * @access private * @return bool true-успешно, false-неудача */ function _init($len) { if (!strlen($this->_alphabet)) { trigger_error("Alphabet is empty"); return false; } if(!($this->_minlen <= $len && $len <= $this->_maxlen)) { //trigger_error("Password length isn't correspond for its conditions"); return false; } //генерируем последний вариант пароля //и заполняем таблицу для бэктрекинга (backtracking) $this->_curPwdLen = $len; $this->_index = 0; $this->_curPwdAr = array(); $this->_curPwd = ""; $this->_lastPwd = ""; for($i = 0; $i < $len; $i++) { $this->_lastPwd .= $this->_alphabet[$this->_alphaLen - 1]; $this->_curPwd .= "a"; //может стоять любой символ $this->_curPwdAr[$i] = -1; } $this->_curPwdAr[$len] = $this->_alphaLen; return true; } /** * Генерирует пароль * @access public * @param &string переменная, куда будет записан пароль * @return bool true-пароль успешно сгенерирован, false-все варианты исчерпаны */ function getNext(&$pwd) { if($this->_curPwd == $this->_lastPwd) { if (!$this->_init($this->_curPwdLen + 1)) return false; } while($this->_index >= 0) { while($this->_curPwdAr[$this->_index] < $this->_intAlphaLen) { $this->_curPwdAr[$this->_index] += 1; $this->_curPwd[$this->_index] = $this->_alphabet[$this->_curPwdAr[$this->_index]]; $this->_index++; if($this->_index == $this->_curPwdLen) { $pwd = $this->_curPwd; return true; } } if($this->_index != $this->_curPwdLen) $this->_curPwdAr[$this->_index] = -1; $this->_index--; } } } ?>
|
index.phpКод | <? include("gen.class.php"); $pwdgen = new CPasswordGenerator(1, 3, "abcxyz123"); while($pwdgen->getNext($pwd)) { print "$pwd\n"; } ?>
|
Так как в этом скрипте отсутствует "случайность" генерирования, мне нужно добавить к этому скрипту "начальную точку отправления". Приведу пример. Запускаем скрипт. Он нам выдаст: a b c x y z 1 2 3 ab ac ax ay az a1 a2 a3 ...Изменим функцию инициализации класса, и добавим в неё "отправную точку", например, возьмём ac: Код | $pwdgen = new CPasswordGenerator(1, 3, "abcxyz123", "ac");
|
в результаты выполнения, должно получиться следующее: ac ax ay az a1 a2 a3 ...То есть мы говорим скрипту, с какой точки нам начинать. Как это сделать? Заранее спасибо.
|