Повторяющиеся результаты функций по генерированию уникальных значений

Daedrikus

Новичок
Повторяющиеся результаты функций по генерированию уникальных значений

Здравствуйте, у меня возникла проблема с регулярно повторяющимися результатами работы класса.
Есть класс с функциями генерирования логинов и паролей.

Есть скрипт по записи того что он сгенерировал в БД, но только вот проблема возникает в том что результаты начинают повторятся. Причем блоками. По 151 запись. Перезапуск скрипта не дает результатов. При перезапуске Apache появляется порядка 20 новых записей, потом опять те же что уже были при предыдущем запуски (так показывает сравнение с таблицей в БД в которой такие логины уже есть).

Пытался найти ответ в мануале и тут на форуме. Наверное плохо искал :) Подозрения падают на кеширования результатов работы класса / функций.


PHP:
<?php

class TextGeneration {
	var $ABC = Array(
		'0' => Array (
			'A', 'E', 'I', 'J', 'O', 'Q', 'U', 'Y'
		),
		'1' => Array (
			'B', 'C', 'D', 'F', 'G', 'H', 'K', 'L', 'M', 'N', 'P', 'R', 'S', 'T', 'V', 'W', 'X', 'Z'
		),
		'2' => Array (
			'1', '2', '3', '4', '5', '6', '7', '8', '9', '0'
		),
	);
	var $MinLoginLength = 4;
	var $MaxLoginLength = 8;
	var $PasswordLength = 10;

	public function LoginGeneration () {
		$LoginLength = rand ($this->MinLoginLength, $this->MaxLoginLength - 1);
		$Login = '';
		$A = rand (0, 1);
		for ($i = 1; $i <= $LoginLength; $i++) {

			if (isset($B) && $B == 2) {
				$B = 1;
			} else {
	            $B = rand (1, 2);
			}

			if ($B == 1) {
				$Login .= $this->ABC[$A][array_rand($this->ABC[$A])];
				if ($A == 0) {$A = 1;} else {$A = 0;}
			} else {
				$index1 = array_rand($this->ABC[$A]);
				$Login .= $this->ABC[$A][$index1];

				$index2 = array_rand($this->ABC[$A]);
				if ($index2 == $index1) {
					$ABC = $this->ABC;
					unset($ABC[$A][$index2]);
					$index2 = array_rand($this->ABC[$A]);
				}
				$Login .= $this->ABC[$A][$index2];

				$i++;
				if ($A == 0) {$A = 1;} else {$A = 0;}
			}
		}
		$Login = strtolower($Login);
		if (rand (0, 1) == 1) {
			$Login = ucfirst($Login);
		}
		return $Login;
	}

	public function PasswordGeneration () {
		$Password = '';
		for ($i = 1; $i <= $this->PasswordLength; $i++) {
			if (isset($A)) {
				$A = rand(0, 2);
			} else {
				$A = rand(0, 1);
			}
			$B = rand(0, 1);
			if ($B == 0) {
				$Password .= strtolower($this->ABC[$A][array_rand($this->ABC[$A])]);
			} else {
				$Password .= strtoupper($this->ABC[$A][array_rand($this->ABC[$A])]);
			}
		}

		return $Password;
	}

}

?>



<?php

class NewUsers {

	var $MaxGenerateUsers = 1000;

	private function GenerateUsers($new_users_count) {
		global $mysql, $TG;

		echo '<TABLE border=0 cellspacing=1 cellpadding=5 width=100% bgcolor=#CCCCCC>';
		for ($u = 1; $u <= $new_users_count; $u++) {

			$Login = $TG->LoginGeneration();

			$Passwd = $TG->PasswordGeneration();

			$result = $mysql->query('SELECT `id` FROM `users` WHERE `login` = "'.$Login.'"');

			if (mysql_num_rows($result) > 0) {
				echo '<TR valign="top" bgcolor=#FF0000>';
			} else {
				$mysql->query('INSERT INTO `users` (
					`login`,
					`passwd`
				) VALUES (
					"'.$Login.'",
					"'.$Passwd.'"
				);');

				echo '<TR valign="top" bgcolor=#FFFFFF>';
			}

			echo '<TD>'.$u.'</TD>';
			echo '<TD>'.$Login.'</TD>';
			echo '<TD>'.$Passwd.'</TD>';
			echo '</TR>';
		}
		echo '</TABLE><BR>';
	}

	function __construct() {
		if (isset($_POST['gen'])) {
			if ($_POST['new_users_count'] > $this->MaxGenerateUsers) {$_POST['new_users_count'] = $this->MaxGenerateUsers;}
			$this->GenerateUsers($_POST['new_users_count']);
		}

		echo '<FORM method="POST">';
		echo 'Колличество новых пользователей: <INPUT type="text" name="new_users_count">';
		echo '<INPUT type="submit" name="gen" value="Сгенерировать">';
		echo '</FORM>';
	}

}


?>
Спасибо.
 

pilot911

Новичок
если все символы - латиница + цифры, проще заменить LoginGeneration и PasswordGeneration на одну функцию:

function createString($max=10) {

return substr(md5(uniqid()), 0, $max);

}
 

Daedrikus

Новичок
pilot911
Спасибо за совет, но этот список генерируемых имен (в дальнейшем из них планируется выбирать имена персонажей для on-line игры, поэтому и были написаны функции с определенными условиями, например: не должно быть более 2 гласных или согласных подряд. Для того чтобы многие результаты работы скрипта были похожи на имена, а не на набор символов.
 

LONGMAN

Dark Side of the Moon..
Тогда в том классе можно добавить проверку на уникальность с запросом к БД. И кстати лучше юзать mt_rand в место rand
 

Daedrikus

Новичок
LONGMAN
Спасибо огромное. Заменил rand на mt_rand, почти все стало уникальным. Скрипт работает дольше, но это не важно.
Спасибо.
 
Сверху