Avatar billede sjh Nybegynder
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++++
  /* ------------------------ */
?>
Avatar billede arne_v Ekspert
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
Avatar billede arne_v Ekspert
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>";
?>
Avatar billede sjh Nybegynder
14. januar 2006 - 06:11 #3
din illustration giver da..

29
105346
29
105346
Avatar billede sjh Nybegynder
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); */
?>
Avatar billede arne_v Ekspert
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
Avatar billede arne_v Ekspert
14. januar 2006 - 08:07 #6
nej
Avatar billede sjh Nybegynder
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
Avatar billede arne_v Ekspert
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
Avatar billede sjh Nybegynder
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..
Avatar billede sjh Nybegynder
14. januar 2006 - 08:16 #10
ved du hvordan man laver sådan en random generator? :D
Avatar billede arne_v Ekspert
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
Avatar billede arne_v Ekspert
14. januar 2006 - 08:19 #12
Avatar billede arne_v Ekspert
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
Avatar billede sjh Nybegynder
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
Avatar billede arne_v Ekspert
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 ?
Avatar billede sjh Nybegynder
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);
Avatar billede arne_v Ekspert
14. januar 2006 - 09:14 #17
35.184.372.088.832 kombinationer af 9 bogstaver
Avatar billede arne_v Ekspert
14. januar 2006 - 09:14 #18
og jeg har forstået hvordan det skal kunne recreate en bestemt
Avatar billede sjh Nybegynder
14. januar 2006 - 09:17 #19
JA 35.184... kombinationer af 9 bogstaver
Avatar billede sjh Nybegynder
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 ;)
Avatar billede sjh Nybegynder
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);
Avatar billede sjh Nybegynder
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");
Avatar billede sjh Nybegynder
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
Avatar billede arne_v Ekspert
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);

?
Avatar billede arne_v Ekspert
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
Avatar billede arne_v Ekspert
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
Avatar billede sjh Nybegynder
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..
Avatar billede sjh Nybegynder
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
Avatar billede arne_v Ekspert
15. januar 2006 - 21:26 #29
et svar
Avatar billede sjh Nybegynder
16. januar 2006 - 03:00 #30
Jeg siger mange tak for hjælpen :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester