Generowanie losowej liczby jest bardzo trudne dla naszych komputerów.
Nie mają pojęcia, co oznacza losowość.
Są zaprogramowane do wykonywania zawsze tych samych instrukcji w ten sam sposób.
Jednak potrzeba wylosowania danej wartości była tak ogromna, że języki programowania (takie jak PHP) zostały wyposażone w funkcje mogące naśladować losowanie. Pamiętaj jednak, że w świecie IT nie ma nic całkowicie przypadkowego.
Losowa liczba w PHP
Liczby losowe są bardzo użyteczne podczas programowania strony internetowej.
Są przydatne do generowania losowych haseł, tymczasowych kodów weryfikacyjnych lub linków aktywacyjnych. Ponadto możesz chcieć wyświetlać różne cytaty lub losowe produkty na swojej stronie głównej, promować losowego autora lub sprzedawcę itp.
Możliwości jest mnóstwo, ale potrzeba jedna.
Jak możesz zmusić PHP do wygenerowania losowej liczby?
Po wylosowaniu liczb, mógłbyś na ich podstawie podjąć decyzję, którą informację pokazać. Jednak, skąd wziąć te liczby?
Funkcja RAND – podstawy
To tyle tytułem wstępu. Czas przyjrzeć się bliżej generowaniu liczb losowych za pomocą najprostszej możliwej metody – funkcji rand:
<? php echo rand ();
Powyższy skrypt wyświetla liczbę z zakresu od 0 do wartości getrandmax(), czyli zdefiniowanego maksimum w Twoim środowisku. W przypadku Windowsa jest to zazwyczaj 32768, podczas gdy w systemach Unix zwracana wartość to 2147483647.
Definiowanie zakresu losowanej wartości
Uzyskanie tak rozłożonej liczby nie zawsze jest tym, czego chcemy.
W większości przypadków chcemy ustawić zakres, z którego ma zostać wybrana liczba losowa. Funkcja rand() w PHP czyni to zadanie niezwykle łatwym.
Po prostu dodaj dwa argumenty w wywołaniu funkcji rand(): wartość minimalną i wartość maksymalną.
Zobaczmy, jak to wygląda w praktyce:
<? php // wybierzmy liczbę od 10 do 50 $pickedNumber = rand (10, 50); echo $pickedNumber;
Za pomocą powyższego skryptu możesz samodzielnie ustawić zakres. Tutaj możesz również zobaczyć, że wynik funkcji rand możesz przypisać do zmiennej, by wykorzystać go w pozostałym kodzie.
Losowy string
Gdy już skończysz losować potrzebne liczby, pojawi się naturalna potrzeba wygenerowania losowego ciągu znaków za pomocą PHP.
Liczby były łatwe.
Jedna prosta metoda, z zakresami lub bez, i masz liczbę.
W przypadku stringa sprawa jest nieco bardziej skomplikowana.
Istnieją dwa popularne sposoby generowania losowego napisu:
1) Z użyciem hasha
Możesz użyć funkcji haszującej, by wygenerować ciąg na podstawie liczby zwróconej przez funkcję rand(). Jest to dość łatwe i proste, ale ciąg będzie zawierał jedynie znaki z przedziału 0-9 i a-f. A więc podstawa szesnastkowa.
Na przykład, jeśli utworzę hash MD5 dla liczby 100, otrzymam:
f899139df5e1059396431415e770c6dd
wynik md5 (’100′);
Ponadto konkretne hashe zwracają zawsze tę samą liczbę znaków.
Najczęściej spotykane to MD5 (użyty w przykładzie, wynik 32 znaki) i SHA1 (wynik 40 znaków).
Możesz użyć funkcji substr(), (sprawdź oficjalną dokumentację) aby uzyskać krótsze ciągi.
Sprawdź ten przykład:
<?php // weźmiemy tylko 6 pierwszych znaków z powyższego wyniku $result = substr(md5('100'), 0, 6); echo $result; // Wyświetli f89913.
2) Definiowanie własnego alfabetu (zestawu dostępnych znaków)
Innym sposobem jest użycie bazy znaków, z których znaki będą losowo wybierane, przy pomocy losowej liczby.
Na przykład, jeśli chcesz otrzymać losowy znak, który może zawierać tylko cyfry, małe i duże litery z alfabetu angielskiego, możesz użyć:
<?php $base = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $charIndex = rand(0, strlen($base) - 1); $char = $base[$charIndex];
I to wszystko.
W zmiennej $base zachowujesz wszystkie możliwe znaki do wyboru. W następnej linii używamy tej samej funkcji rand, co poprzednio, by wybrać znak z naszego alfabetu. Musisz ustawić górny limit losowanej wartości do całkowitej liczby znaków w zmiennej $base. Użyłem do tego metody strlen(), która zwraca długość stringa (sprawdź oficjalną dokumentację).
Jeśli potrzebujesz więcej liter niż jedna, po prostu użyj pętli for.
Wartości losowe z tablicy
Jeśli chodzi o tablice i wybieranie z nich losowego elementu (lub elementów), istnieją również dwa popularne sposoby osiągnięcia tego celu.
- Możesz wymieszać elementy tablicy i pobrać żądaną liczbę od początku.
- Możesz wybrać losowe elementy na podstawie losowych indeksów bez dotykania oryginalnej tablicy.
Tasowanie tablicy metodą shuffle
Pierwsza metoda polega na przetasowaniu oryginalnej tablicy i umieszczeniu jej elementów w losowej kolejności.
Następnie możesz wziąć pierwsze X elementów i założyć, że są one wybrane losowo.
Sprawdź następujący przykład:
<?php $chooseFrom = array('jeden', 'dwa', 'trzy', 'cztery'); shuffle ($chooseFrom); echo $chooseFrom[0];
W moim przypadku skrypt wyświetlił „cztery”.
Spróbuj uruchomić ten sam skrypt kilka razy, a zobaczysz, że wartość stale się zmienia.
Losowanie elementów metodą ARRAY_RAND
W PHP istnieje wbudowana funkcja do pobierania losowych elementów z tablicy. Nazywa się array_rand(). (sprawdź dokumentację)
Z jej pomocą możesz losowo wybrać istniejące indeksy w tablicy, używając do tego zaledwie jednej instrukcji w kodzie. Liczba losowanych indeksów ustawiana jest w drugim argumencie funkcji array_rand.
Sprawdź następujący przykład:
<?php $chooseFrom = array('jeden', 'dwa', 'trzy', 'cztery', 'pięć'); // 3 to liczba losowanych wybranych elementów $count = 3; $result = array_rand($chooseFrom, $count); echo $chooseFrom[$result[0]];
Mając losowe indeksy, które na pewno istnieją we wskazanej tablicy, możesz bezpiecznie odnieść się do któregokolwiek (tak jak robię to w ostatniej linijce).
Polecenie array_rand działa dobrze w przypadku tablic klasycznych i asocjacyjnych.
Losowanie nazwy użytkownika
Zależnie od tego, jak podejdziesz do tematu, może się to okazać bardzo łatwym albo dość trudnym zadaniem.
Sposób łatwy to, przykładowo, utworzenie wspólnego przedrostka (prefixu), jak np. user, po czym dodanie liczby losowej na końcu. Otrzymamy coś w stylu user19782. Zawsze możesz skorzystać z jakiegoś licznika, by losowane liczby się nie powtórzyły. Ewentualnie, losować tak długo, aż trafisz na wolną nazwę.
Jeśli pójdziesz o krok dalej, możesz przykładowo przygotować gotowy zestaw nazw/imion, które będą służyły jako przedrostek. Niektóre aplikacje, przykładowo, korzystają z imion z greckiej i rzymskiej mitologii albo popularnych superbohaterów. Możliwości są ogromne.
Jednak zawsze sprowadza się to do jednego.
Masz tablicę z listą dostępnych przedrostków, z której musisz wylosować jeden element i zaprezentować użytkownikowi. Do tego możesz zaproponować jakieś uzupełnienie (jak liczba losowa, kolejna wolna liczba całkowita, data urodzenia itp.)
Większość nowoczesnych aplikacji (takich jak Gmail) działa w ten sam sposób. Pozwalają ci wybrać nazwę użytkownika, a jeśli jest już zajęta (i prawie we wszystkich przypadkach tak jest), sugerują rozszerzenie twojej nazwy użytkownika o dodatkowe znaki.
Losowe hasło w PHP
Losowanie hasła jest trochę bardziej skomplikowane, ponieważ nie chcesz, aby wygenerowane hasło zostało łatwo złamane i odgadnięte.
Po pierwsze, funkcja losowa rand() jest przewidywalna. Jeśli potrafisz odgadnąć ziarno (tzw. seed), możesz odkryć dowolną z wygenerowanych liczb losowych.
Zwykle ziarno do losowania to: aktualny czas.
W starszych wersjach PHP, kiedy trzeba było samemu seedować funkcję rand przy użyciu srand, dość często używano:
<?php srand(time());
A jeśli osoba atakująca mogła odgadnąć czas utworzenia konta, istniała duża szansa, że złamie hasło.
Teraz ludzie są tego bardziej świadomi i dobrą praktyką jest używanie bardziej specyficznych narzędzi. Istnieje świetna funkcja, która jest kryptograficznie bezpieczna – random_bytes() i prawie taka sama przy użyciu otwartego SSL: openssl_random_pseudo_bytes().
Z ich pomocą możesz generować bezpieczne losowe ciągi.
Sprawdź przykład:
<?php $passwordLength = 8; $pass = bin2hex(random_bytes($passwordLength / 2));
Losowo wygenerowane hasło w moim przypadku to:
„0e2cbcec„
wygenerowane hasło
Czas na podsumowanie
Poznałeś właśnie masę przykładów wykorzystujących możliwości losowania w PHP.
Wiesz już, jak wygenerować liczbę losową za pomocą prostej funkcji rand. Możesz wybrać losowo ciąg znaków, nazwę użytkownika lub hasło. Ponadto możesz wybierać losowe elementy z tablicy.
Teraz chciałbym coś usłyszeć od ciebie.
Z których zastosowań funkcji rand korzystasz najczęściej? A może w ogóle nie używasz losowania w kodzie PHP?
Daj znać koniecznie w komentarzach poniżej.