h0d
31.12.2007, 21:05
pwdgen.class.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--;
}
}
}
?>
пример использования:
<?
include("pwdgen.class.php");
//минимальная длина, максимальная длина, алфавит
$pwdgen = new CPasswordGenerator(1, 3, "abcxyz123");
while($pwdgen->getNext($pwd))
{
print "$pwd\n";
}
?>
<?
/**
* 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--;
}
}
}
?>
пример использования:
<?
include("pwdgen.class.php");
//минимальная длина, максимальная длина, алфавит
$pwdgen = new CPasswordGenerator(1, 3, "abcxyz123");
while($pwdgen->getNext($pwd))
{
print "$pwd\n";
}
?>