webForumDet fria alternativet

Generera slumpmässiga läsenord

PHP

10 svar · 523 visningar · startad av Niklasson

Medlem sedan nov. 2000857 inlägg
Frågan#1

Jag använder denna koden för att generera slumpmässiga lösenord. Problemet är att när jag loopar c:a 3000 poster så lyckas den skapa flera identiska strängar.

Det verkar väl inte speciellt slumpmässigt med så många teckenalternativ och stränglängden som är 30 tecken?
Någon som har en bättre kod?

$tecken = 'ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvwxyz0123456789';
mt_srand((double)microtime()*1000000^getmypid());
while (strlen($kod)<30)
{
$kod.=substr($tecken,(mt_rand()%strlen($tecken)),1);
}
Medlem sedan aug. 20002 975 inlägg
#2

Nej, inte bättre, men en nödlösning:

<?php  
function getPassword(){
  $tecken =  'ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvwxyz0123456789';
  mt_srand((double)microtime()*1000000^getmypid());
  $kod = "";
  while (strlen($kod)<30)
  {
    $kod.=substr($tecken,(mt_rand()%strlen($tecken)),1);
  }
  return $kod;
}

$losenord = array();
while(sizeof($losenord)< 3000){
  $tLosenord = getPassword();
  if(!in_array($tLosenord, $losenord)){
    $losenord[] = $tLosenord;
  }
}

?>
Medlem sedan nov. 2000857 inlägg
#3

visst går det att kolla om det redan finns en sådan kodsträng, och generera en ny men visst är det konstigt. ? Om jag kör koden nedan så kan den skapa dubletter redan vid 400:e strängen... :q

Hur kan det bli så?? Det borde ju finnas så jäkla många alternativ så det skulle ta forever att lyckas generera två likadana koder även om $kod bara skulle vara 10 tecken.

<?php
ini_set("max_execution_time","86400");
ignore_user_abort(true);
set_time_limit(0);

$tecken = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";

for ($i=1;$i<10000+1;$i++)
{
mt_srand((double)microtime()*1000000^getmypid());
	while(strlen($kod)<10)
	{
	$kod .= substr($tecken,(mt_rand()%strlen($tecken)),1);
	}
echo "$i. $kod<br>";
	if (eregi($kod, $langkod))
	{
	echo "dublett<br><br>";
	exit;
	}
$langkod .= $kod;
unset($kod);
}
?>
Medlem sedan nov. 2000857 inlägg
#4

*Det löste sig* ;)

Medlem sedan aug. 20002 975 inlägg
#5

Niklasson skrev:

*Det löste sig* ;)

Vad var hemligheten ?

Medlem sedan nov. 2000857 inlägg
#6

<?php
$kod = crc32($epost.microtime());
if ($kod < 0) { $kod = $kod * -1; }
?>

(psphplogin) ;)

Medlem sedan aug. 20002 975 inlägg
#7

Så istället för en 30-teckens kod använder du en 32-bitars checksumma ?
Men det vore fortfarande intressant att veta varför du inte fick unika koder.

Vad är psphplogin ?

Medlem sedan feb. 20012 412 inlägg
#8

Matte skrev:

Vad är psphplogin ?

Jag skulle gissa på att det står för PärSvanströmPHPLogin :)

Medlem sedan aug. 20002 975 inlägg
#9

Sökte på all världens sökmotorer, men glömde att söka på webForum. :e

Medlem sedan feb. 20012 412 inlägg
#10

Adress till den sökmotor som oftast ger bäst träffar :P

http://www.webforum.nu/search.php?s=

Medlem sedan nov. 2000857 inlägg
#11

Ja det är lite mystiskt, men jag är inte speciellt förvånad egentligen.
Jag har en simpel bannerrotator på min sida där jag provat slumpa med rand() och mt_rand() . Trots detta ser jag jätteklart i statistiken att det är väldigt ojämnt i resultaten. Vissa banners visas mycket mer än andra... x(

270 ms totalt · 4 externa anrop · v20260731065814-full.2f471f9e
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)