Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > в класс генератора паролей добавить отправную точк


Автор: NetFlame 5.8.2008, 21:42
Здравствуйте.

Есть скрипт, который посимвольно перебирает, ну, например, пароль:

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
...


То есть мы говорим скрипту, с какой точки нам начинать.
Как это сделать?

Заранее спасибо.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)