pwdgen.class.php: PHP: <? /** * Password Generator Class * @author hodik * @package Classes * @subpackage pwdgen * @version 1.0 * @filesource */ /** * CPasswordGenerator * @package Classes * @subpackage pwdgen */ 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--; } } } ?> пример использования: PHP: <? include("pwdgen.class.php"); //минимальная длина, максимальная длина, алфавит $pwdgen = new CPasswordGenerator(1, 3, "abcxyz123"); while($pwdgen->getNext($pwd)) { print "$pwd\n"; } ?>