Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Funkcja generująca hasła
Forum PHP.pl > Forum > Przedszkole
we3b
Witam.

Jestem w trakcie nauki PHP. Przjerzałem kilka gotowych funkcji do generowania heseł i na jej podstawie napisałem własną. Z formularza pobierane są dwie wartośći - długość oraz złożoność hasła. Kod funkcji wygląda następująco:

  1. <?php
  2. function generate_password($length, $strength)
  3. {
  4.  $letters = 'abcdefghijklmnopqrstuvwxyz';
  5.  $numbers = '0123456789';
  6.  $special_characters = '#$&()*/=?@[]^';
  7.  
  8.  $i = 1;
  9.  
  10.  while ($i <= $length)
  11.  {
  12.      switch ($strength)
  13.      {
  14.          case 1:
  15.              $seed = $letters . $numbers;
  16.              $character = $seed{mt_rand() % strlen($seed)};
  17.              break;
  18.          case 2:
  19.              $seed = $letters . strtoupper($letters) . $numbers;
  20.              $character = $seed{mt_rand() % strlen($seed)};
  21.              break;
  22.          case 3:
  23.              $seed = $letters . strtoupper($letters) . $numbers . $special_characters;
  24.              $character = $seed{mt_rand() % strlen($seed)};
  25.              break;
  26.      }
  27.   
  28.      if (!strstr($password, $character)) 
  29.      {
  30.          $password .= $character;
  31.          $i++;
  32.      }
  33.  }
  34.  
  35.  return $password;
  36. }
  37.  
  38. ?>



Moje pytania wiążą się z doszlifowaniem kodu - jak się uczyć to od razu poprawnie. Trzeba coś w tej funkcji jeszcze zoptymalizować/poprawić? Istnieje jakaś znacząca różnica w wykonaniu pomiędzy:
  1. <?php
  2. $character = $seed{mt_rand() % strlen($seed)};
  3. ?>


a tym:
  1. <?php
  2. $character = $seed{mt_rand(0, strlen($seed) - 1)};
  3. ?>


Z góry dziękuję za poświęcony czas.
DREEMus
czemu nie zrobisz sobie "generowania strony" questionmark.gif

Wstaw skrypt w pętle 100x albo i 1000x i zobacz jakie będą czasy smile.gif
we3b
O tym nie pomyślałem. Chodzi mi o sprawdzenie kodu pod względem wykorzystanych funkcji. Może akurat istnieją jakieś, dzięki którym kod będzie można jeszcze skrócić. Zastanawiam się też, czy ciągów znaków nie da się określić podobnie jak w wyrażeniach regularnych ([a-zA-Z] itd.)?
kazag
ło matko, nie prosciej zrobić np:
Kod
$a=rand(1,10000);
$hash=md5($a);


i pobrać sobie np. pierwsze 8 znaków?
erix
Tzn. tak się pewnie nie da, ale nie ma problemu, jeśli chodzi o wartości w kodach ASCII. winksmiley.jpg

Wtedy możesz skorzystać z np. range" title="Zobacz w manualu PHP" target="_manual.
kefirek
Najlepiej tak

  1. <?php
  2. $dlugosc = 20;
  3.  
  4. function haslo($dlugosc){
  5. $haslo = "";
  6. for ($i=0;$i<=$dlugosc;$i++) { $haslo.= chr(rand(97, 122)); }
  7. return $haslo;
  8. }
  9.  
  10. echo haslo($dlugosc);
  11. ?>


Obecnie funkcja generuje hasła z samych liter.
Jak chcesz by hasło było trudniejsze to zmien 122 na wiekszą liczbę
we3b
Wcześniej robiłem to właśnie używając
Kod
chr(rand(33, 122));


Chciałem jednak mieć większą kontrolę nad dozwolonym ciągiem znaków (głównie mam tu na myśli znaki specjalne). Myślałem też nad sprawdzaniem wygenerowanego ciągu i zamianą nieporządanych znaków. Wtedy musiałyby być ponownie wylosowane. Chyba, że załatwić to za pomocą wyrażeń regularnych?
erix
Cytat
głównie mam tu na myśli znaki specjalne

A jaki problem połączyć ze sobą parę zakresów?
we3b
Wykorzystanie rand(x, y) . rand(p, q) nie ma dla mnie sensu. Wynik jest w postaci kilku znaków z pierwszego zakresu i po nich z drugiego. Chyba, że by potasować znaki lub połączyć w jakiś inny nieznany mi sposób.
erix
Utwórz tablicę z elementami z obu zakresów, potem array_rand" title="Zobacz w manualu PHP" target="_manual.
we3b
Dzięki, właśnie na to liczyłem. Przećwiczę sobie operacje na tablicach. Mam kilka problemów, ale mam nadzieję, że dzięki dokumentacji i Google sobie poradzę. W przeciwnym razie jeszcze będę pisał.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.