13. januar 2006 - 13:51
Der er
29 kommentarer og 1 løsning
mt_srand(xxx)
Jeg har lavet et funktion som kan generaer 32^9 kombinationer.. Men nu vil jeg godt vide hvor langt den er kommet så jeg ikke skal tjekke om kode/key er brugt, til det bruger jeg så mt_srand(xxx) for at få den tabel rekke.. problemer er bare at alle tal over 50000 bruger den ikke.. hvordan kan jeg klare den?? <?php function GenerateKey() { /* 32^9 (eller 35.184.372.088.832) kombinationer */ $ValidChars = "0123456789ABCDEFGHJKLMNPQRTUVWXY"; for ($i=0; $i < 9; $i++) { $strOut .= $ValidChars[mt_rand(0, 31)]; } return $strOut; } /* --- Girver kun 50000 --- */ for ($i=1; $i <= 99999; $i++) { mt_srand($i); $strKey = GenerateKey(); $arrKey[$strKey] = ""; } echo count($arrKey); //-- <- 50000 /* ------------------------ */ /* --- Girver 99999++++ --- */ for ($i=1; $i <= 99999; $i++) { $strKey = GenerateKey(); $arrKey[$strKey] = ""; } echo count($arrKey); //-- <- 99999++++ /* ------------------------ */ ?>
Annonceindlæg tema
Offentlig digitalisering
Fra effektivisering til digital suverænitet. Hvordan skaber det offentlige en digital fremtid med AI, sikkerhed og kontrol i centrum?
13. januar 2006 - 19:12
#1
så vidt jeg kan se så gælder det at mt_srand(X) hvor X er lige multiple mt_rand() og mt_srand(Y) hvor Y = X + 1 multiple mt_rand() vil give samme tal. Og derfor får du i løkken hvor du kalder mt_srand kun 50000 unikke keys for 100000 gennemløb det er almindeligt kendt at det er meget dårligt at kalde srand mange gange den her specifikke grund er dog speciel
13. januar 2006 - 19:12
#2
til illustration <?php mt_srand(123456); $r = mt_rand(0, 31); echo "$r<br>"; $r = mt_rand(0, 1000000); echo "$r<br>"; mt_srand(123457); $r = mt_rand(0, 31); echo "$r<br>"; $r = mt_rand(0, 1000000); echo "$r<br>"; ?>
14. januar 2006 - 06:11
#3
din illustration giver da.. 29 105346 29 105346
14. januar 2006 - 06:56
#4
er det sådan du mener?? <?php function GenerateKey($intNumber) { /* 32^9 (eller 35.184.372.088.832) kombinationer */ $ValidChars = "0123456789ABCDEFGHJKLMNPQRTUVWXY"; if ($intNumber) mt_srand(($intNumber % 50000) + 1); for ($i=0; $i < 9; $i++) { $strOut .= $ValidChars[(mt_rand(0, 1000000) + $intNumber) % 31]; } return $strOut; } echo GenerateKey(35184372088833); /* Kan dog ikke gennemløbe 35184372088833 for ($i=1; $i <= 35184372088833; $i++) { $strKey = GenerateKey($i); $arrKey[$strKey] = ""; } echo count($arrKey); */ ?>
14. januar 2006 - 08:04
#5
netop mt_srand(123456) og mt_srand(123457) giver samme tal fordi det er et lige tal og samme tal +1
14. januar 2006 - 08:07
#6
nej
14. januar 2006 - 08:08
#7
Kunne man ikke lave sin egen rand() altså så man er sikker på at den kan 32^9 kombinationer?? :D
14. januar 2006 - 08:12
#8
mt_rand er en fremragende random generator og kan sagtens generere 32^9 kombinationer men mt_srand er beregnet til kun at blive kaldt en gang
14. januar 2006 - 08:15
#9
Ja men så kan jeg ikke se at jeg kan bruge den.. da jeg gerne vil kunne bestemme input tal..
14. januar 2006 - 08:16
#10
ved du hvordan man laver sådan en random generator? :D
14. januar 2006 - 08:18
#11
almindelige LCG generatorer er simple at lave men du skal enten have en 48 eller 64 bit eller en combined fordi 32 bit er ikke nok til at dække 35000 milliarder
14. januar 2006 - 08:19
#12
14. januar 2006 - 08:22
#13
nogle af L'Ecuyers fra den sidste artikel vil kunne dække dit behov sorry for at artiklerne er i C/Java/C# men PHP er så almindelig til den slags men du bør kunne udlede logikken fra koden uden problemer
14. januar 2006 - 08:40
#14
kan du lave sådan en til mig i php (48 eller 64 bit) :D Jeg vil godt give 200 point for det :D
14. januar 2006 - 09:04
#15
det vil først blive søndag aften og det er ikke sikert at jeg har tid du er klar over at det vil fylde over 300000 GB på disk og tage måneder eller år at generere dem alle - ikke ?
14. januar 2006 - 09:11
#16
jeg var ikke klar over at det vil fylde 300000 GB på disken :D men ja tiden ved jeg godt er lang.... Du må godt lave den for mig men kun hvis det kan laves sådan at jeg kan skrive et nummer og så få den tabel rekke som passer.. fx. echo GenerateKey(1); fx. echo GenerateKey(100); fx. echo GenerateKey(1000); ... ... fx. echo GenerateKey(35184372088832);
14. januar 2006 - 09:14
#17
35.184.372.088.832 kombinationer af 9 bogstaver
14. januar 2006 - 09:14
#18
og jeg har forstået hvordan det skal kunne recreate en bestemt
14. januar 2006 - 09:17
#19
JA 35.184... kombinationer af 9 bogstaver
14. januar 2006 - 09:19
#20
som sådan behøver det ikke at være random.. bare jeg kan få 35.184... kombinationer af 9 bogstaver ved at indtaste et tal mellem 1 og 35184372088832 ;)
14. januar 2006 - 09:30
#21
hmm måske man kunne bruge MD5() til det ?? function GenerateKey($intNumber) { /* 32^9 (eller 35.184.372.088.832) kombinationer */ $ValidChars = "0123456789ABCDEFGHJKLMNPQRTUVWXY"; $strMD5 = MD5($intNumber); for ($i=0; $i < 9; $i++) { $strChar = substr($strMD5, ($i * 2), 2); $intChar = (hexdec($strChar) % 32); $strOut .= $ValidChars[$intChar]; } return $strOut; } echo GenerateKey(35184372088832);
14. januar 2006 - 09:39
#22
Var det ikke noget som kunne bruges (de skal bare ind som en string) echo GenerateKey("1")."<br>"; echo GenerateKey("2")."<br>"; echo GenerateKey("33")."<br>"; echo GenerateKey("45")."<br>"; echo GenerateKey("35184372088831")."<br>"; echo GenerateKey("35184372088832");
14. januar 2006 - 16:44
#23
arne_v : (35.184.372.088.832 kombinationer af 9 bogstaver) det skal altså være de bogstaver/tal her: 0123456789ABCDEFGHJKLMNPQRTUVWXY I, O, S og Z er ikke med fordi: I kan ses som 1 O kan ses som 0 S kan ses som 5 Z kan ses som 2
15. januar 2006 - 16:43
#24
har du prøvet: for ($i=1; $i <= 99999; $i++) { mt_srand(2*$i); $strKey = GenerateKey(); $arrKey[$strKey] = ""; } echo count($arrKey); ?
15. januar 2006 - 16:44
#25
da en integer kun kan antage et par milliarder værdier så skal du have mere end en integer for at kunne indeksere dig ind i de 35 trillioner værdier
15. januar 2006 - 16:46
#26
muligvis kan du gpdt bruge din MD5 men det er en noget anderledes fisk og du kan f.eks. også kalde den med bogstaver og få noget ud af det
15. januar 2006 - 17:09
#27
Jeg har tested den MD5 funktion og kom til 1.100.001 kombinationer så fik jeg timeout på min php.. filen kom også til at fylde 24,7 MB /* $intFrom = $_GET["start"]; if (!$intFrom) $intFrom = 1; $intTo = ($intFrom + 50000); for ($i=$intFrom; $i < $intTo; $i++) { $strKey = GenerateKey($i); $strOut .= $strKey."\n"; } $hOpen = fopen("keys.txt", "aw+"); fwrite($hOpen, $strOut); fclose($hOpen); echo '<a href="phpRegistration.php?start='.$intTo.'">Next</a>'; */ /* Fik timeout når jeg kørte den her. ved 1.150.001 $arrKeys = file("keys.txt"); foreach($arrKeys as $value) { $arrTest[$value] = ""; } echo count($arrTest); */ Men jeg vil da lige prøve den med mt_srand(2*$i); Du må også gedt smide et svar..
15. januar 2006 - 17:17
#28
(og du kan f.eks. også kalde den med bogstaver og få noget ud af det) Det er nok ikke så smart :D jeg kan jo ikke se hvor langet jeg er kommet ved at se på nogle bogstaver.. :D
15. januar 2006 - 21:26
#29
et svar
16. januar 2006 - 03:00
#30
Jeg siger mange tak for hjælpen :-)
Vi tilbyder markedets bedste kurser inden for webudvikling