Забрана на дублиране на символи в тази функция

kWo_2

Registered
Имам "функция" за генериране на произволно генериран код, но той генерира с повтарящи се символи.. Искам някак си да направя така, че да не може да се дублират било то букви, числа или символи.

Ето я и нея

Код:
    $chars_length = (strlen($chars) - 1);

    $string = $chars{rand(0, $chars_length)};
    
    // 
    for ($i = 1; $i < $length; $i = strlen($string))
    {
        // 
        $r = $chars{rand(0, $chars_length)};
        
        // 
        if ($r != $string{$i - 1}) $string .=  $r;
    }
    return $string;

В момента примерно извежда F122F5g443q. Както се вижда се дублират F, 4 и 2. Ако може и да прави разлика между малки и големи букви при забраната на дублиране. Тоест ако имам една малка и една голяма буква f/F то тя да може да се дублира :)
 
Бавния начин :
Пазиш в 1 масив буквите използвани до сега и гледаш с in_array()

Средно-бързия :
Пазив в 1 масив буквите като при добавяне запазваш сортирания им ред и търсиш с binary search

Бързия начин :
Хешираш буквите до индекс на булев масив и просто проверяваш дали съответният индекс е true/false
 
<?php
$array = range("a", "z");
$array = array_merge($array, range("A", "Z"));
$array = array_merge($array, range(0, 9));
shuffle($array);
$string = implode("", $array);
echo substr($string, 0, 10);
?>
В червено - дължината на изходния низ
Средно 0.00015 секунди за изпълнение
 
Raiden с този код как мога да му задам колко числа може да генерира в кода и колко букви. Само ако съм му задал нещо, а иначе да си го генерира както е в момента?

Иначе този код които си дал си генерира кода перфектно :)
 
Код:
function random($bukvi, $cifri) {
	$array = range("a", "z");
	$array = array_merge($array, range("A", "Z"));
	$array = array_merge($array, range(0, 9));
	shuffle($array);
	if($cifri === FALSE) {
		$string = implode("", $array);
		return substr($string, 0, $bukvi);
	}
	$return = "";
	foreach($array as $char) {
		if($cifri == 0 && $bukvi == 0) { break; } 
		if(is_numeric($char) && $cifri > 0) {
			$return .= $char;
			$cifri -= 1; }
		else if(is_string($char) && $bukvi > 0) {
			$return .= $char;
			$bukvi -= 1; }
	}
	return $return;
}
echo random(10, FALSE); //0.00016s
echo random(15, 5); //0.0002s
 

Back
Горе