Metoda Random::alphanumericString($length)robi, co chcesz. Jeśli chcesz zbudować to samodzielnie, nie używaj żadnego losowego źródła innego niż wbudowane PHP random_byteslub random_int.
krakaj
Odpowiedzi:
164
Najpierw utwórz ciąg ze wszystkimi możliwymi znakami:
Ta implementacja jest również przydatna, jeśli chcesz usunąć znaki, które wyglądają tak samo, jak „l” i „1”, „O” i „0”. Jest to opłacalne przy generowaniu nowych haseł dla użytkowników.
Mark Nold,
10
Używam również tej techniki i usuwam wszystkie samogłoski, aby przypadkowo nie dać komuś czegoś niegrzecznego jako hasła.
nickf
10
Niewielkie ulepszenie: mt_rand()jest bezpośrednim zamiennikiem rand()i jest lepsze.
Grilse
11
Wykonywanie strlen()każdej iteracji nie jest dobre. Przypisz strlen($characters) - 1do zmiennej i wykonaj strlen poza cyklem. Nie jest to krytyczne w tym przypadku, ale to tylko ton Mauvais .
mintobit
6
Rozważ użycie random_int, jeśli potrzebujesz bezpiecznego kryptograficznie losowego.
PHP7 wprowadziło random_x()funkcje, które powinny być jeszcze lepsze. Jeśli pochodzisz z PHP 5.X, użyj doskonałej biblioteki paragonie / random_compat, która jest wypełnieniem dla random_bytes () i random_int () z PHP 7.
Użyj tabeli ASCII, aby wybrać zakres liter, gdzie: $ range_start, $ range_end to wartość z kolumny dziesiętnej w tabeli ASCII.
Uważam, że ta metoda jest ładniejsza w porównaniu z metodą opisaną, w której zakres znaków jest szczegółowo zdefiniowany w innym ciągu.
// range is numbers (48) through capital and lower case letters (122)
$range_start = 48;
$range_end = 122;
$random_string = "";
$random_string_length = 10;
for ($i = 0; $i < $random_string_length; $i++) {
$ascii_no = round( mt_rand( $range_start , $range_end ) ); // generates a number within the range// finds the character represented by $ascii_no and adds it to the random string// study **chr** function for a better understanding
$random_string .= chr( $ascii_no );
}
echo $random_string;
To miłe, chociaż znaki niealfanumeryczne mieszczą się w tym zakresie ACSII.
Bower
4
Wiem, że to stary post, ale chciałbym wnieść swój wkład w zajęcia, które stworzyłem na podstawie odpowiedzi Jeremy'ego Rutena i ulepszyłem sugestiami w komentarzach:
Proste osoby ... ale pamiętaj, że każdy bajt jest losowy z zakresu od 0 do 255, co w przypadku losowego ciągu będzie w porządku. Pamiętaj też, że każdy bajt będzie reprezentował dwa znaki.
$str = bin2hex(random_bytes(32)); // 64 character string returned
Jeśli chcesz to zrobić w bardzo łatwy sposób, możesz oprzeć się na istniejących funkcjach PHP. Oto kod, którego używam:
substr( sha1( time() ), 0, 15 )
time()podaje aktualny czas w sekundach od epoki, sha1()szyfruje go do łańcucha 0-9a-f i substr()pozwala wybrać długość. Nie musisz zaczynać od znaku 0 i niezależnie od różnicy między tymi dwoma liczbami będzie długość ciągu.
Odpowiedź Jeremy'ego jest świetna. Jeśli tak jak ja nie masz pewności, jak zaimplementować funkcję range (), możesz zobaczyć moją wersję za pomocą range ().
Random::alphanumericString($length)
robi, co chcesz. Jeśli chcesz zbudować to samodzielnie, nie używaj żadnego losowego źródła innego niż wbudowane PHPrandom_bytes
lubrandom_int
.Odpowiedzi:
Najpierw utwórz ciąg ze wszystkimi możliwymi znakami:
$characters = 'abcdefghijklmnopqrstuvwxyz0123456789';
Możesz również użyć range () aby zrobić to szybciej.
Następnie w pętli wybierz losową liczbę i użyj jej jako indeksu do
$characters
ciągu, aby uzyskać losowy znak, i dołącz go do swojego ciągu:$string = ''; $max = strlen($characters) - 1; for ($i = 0; $i < $random_string_length; $i++) { $string .= $characters[mt_rand(0, $max)]; }
$random_string_length
jest długością losowego ciągu.źródło
mt_rand()
jest bezpośrednim zamiennikiemrand()
i jest lepsze.strlen()
każdej iteracji nie jest dobre. Przypiszstrlen($characters) - 1
do zmiennej i wykonaj strlen poza cyklem. Nie jest to krytyczne w tym przypadku, ale to tylko ton Mauvais .Podoba mi się ta funkcja do pracy
function randomKey($length) { $pool = array_merge(range(0,9), range('a', 'z'),range('A', 'Z')); for($i=0; $i < $length; $i++) { $key .= $pool[mt_rand(0, count($pool) - 1)]; } return $key; } echo randomKey(20);
źródło
Wygeneruj silny kryptograficznie, losowy (potencjalnie) 8-znakowy ciąg za pomocą funkcji openssl_random_pseudo_bytes :
echo bin2hex(openssl_random_pseudo_bytes(4));
Sposób proceduralny:
function randomString(int $length): string { return bin2hex(openssl_random_pseudo_bytes($length)); }
Aktualizacja:
PHP7 wprowadziło
random_x()
funkcje, które powinny być jeszcze lepsze. Jeśli pochodzisz z PHP 5.X, użyj doskonałej biblioteki paragonie / random_compat, która jest wypełnieniem dla random_bytes () i random_int () z PHP 7.function randomString($length) { return bin2hex(random_bytes($length)); }
źródło
Rozwiązanie jednoprzewodowe:
echo substr( str_shuffle( str_repeat( 'abcdefghijklmnopqrstuvwxyz0123456789', 10 ) ), 0, 7 );
Możesz zmienić parametr substr, aby ustawić inną długość łańcucha.
źródło
Użyj tabeli ASCII, aby wybrać zakres liter, gdzie: $ range_start, $ range_end to wartość z kolumny dziesiętnej w tabeli ASCII.
Uważam, że ta metoda jest ładniejsza w porównaniu z metodą opisaną, w której zakres znaków jest szczegółowo zdefiniowany w innym ciągu.
// range is numbers (48) through capital and lower case letters (122) $range_start = 48; $range_end = 122; $random_string = ""; $random_string_length = 10; for ($i = 0; $i < $random_string_length; $i++) { $ascii_no = round( mt_rand( $range_start , $range_end ) ); // generates a number within the range // finds the character represented by $ascii_no and adds it to the random string // study **chr** function for a better understanding $random_string .= chr( $ascii_no ); } echo $random_string;
Zobacz więcej:
źródło
Wiem, że to stary post, ale chciałbym wnieść swój wkład w zajęcia, które stworzyłem na podstawie odpowiedzi Jeremy'ego Rutena i ulepszyłem sugestiami w komentarzach:
class RandomString { private static $characters = 'abcdefghijklmnopqrstuvwxyz0123456789'; private static $string; private static $length = 8; //default random string length public static function generate($length = null) { if($length){ self::$length = $length; } $characters_length = strlen(self::$characters) - 1; for ($i = 0; $i < self::$length; $i++) { self::$string .= self::$characters[mt_rand(0, $characters_length)]; } return self::$string; } }
źródło
Proste osoby ... ale pamiętaj, że każdy bajt jest losowy z zakresu od 0 do 255, co w przypadku losowego ciągu będzie w porządku. Pamiętaj też, że każdy bajt będzie reprezentował dwa znaki.
$str = bin2hex(random_bytes(32)); // 64 character string returned
źródło
Może coś tutaj przeoczyłem, ale oto sposób na użycie funkcji uniqid () .
źródło
uniqid
nie jest w żaden sposób przypadkowa. Jest to całkowicie przewidywalne. To pytanie bardzo szczegółowo dotyczy ciągów pseudolosowych.Wykonałem następującą szybką funkcję, aby bawić się nią
range()
. To po prostu może czasem komuś pomóc.Function pseudostring($length = 50) { // Generate arrays with characters and numbers $lowerAlpha = range('a', 'z'); $upperAlpha = range('A', 'Z'); $numeric = range('0', '9'); // Merge the arrays $workArray = array_merge($numeric, array_merge($lowerAlpha, $upperAlpha)); $returnString = ""; // Add random characters from the created array to a string for ($i = 0; $i < $length; $i++) { $character = $workArray[rand(0, 61)]; $returnString .= $character; } return $returnString; }
źródło
Możesz użyć następującego kodu. Jest podobny do istniejących funkcji, z tym wyjątkiem, że możesz wymusić liczbę znaków specjalnych:
function random_string() { // 8 characters: 7 lower-case alphabets and 1 digit $character_sets = [ ["count" => 7, "characters" => "abcdefghijklmnopqrstuvwxyz"], ["count" => 1, "characters" => "0123456789"] ]; $temp_array = array(); foreach ($character_sets as $character_set) { for ($i = 0; $i < $character_set["count"]; $i++) { $random = random_int(0, strlen($character_set["characters"]) - 1); $temp_array[] = $character_set["characters"][$random]; } } shuffle($temp_array); return implode("", $temp_array); }
źródło
function generateRandomString($length = 10) { $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $charactersLength = strlen($characters); $randomString = ''; for ($i = 0; $i < $length; $i++) { $randomString .= $characters[rand(0, $charactersLength - 1)]; } return $randomString; } echo generateRandomString();
źródło
Jeśli chcesz to zrobić w bardzo łatwy sposób, możesz oprzeć się na istniejących funkcjach PHP. Oto kod, którego używam:
substr( sha1( time() ), 0, 15 )
time()
podaje aktualny czas w sekundach od epoki,sha1()
szyfruje go do łańcucha 0-9a-f isubstr()
pozwala wybrać długość. Nie musisz zaczynać od znaku 0 i niezależnie od różnicy między tymi dwoma liczbami będzie długość ciągu.źródło
To jest coś, czego używam:
$cryptoStrong = true; // can be false $length = 16; // Any length you want $bytes = openssl_random_pseudo_bytes($length, $cryptoStrong); $randomString = bin2hex($bytes);
Możesz zobaczyć Dokumenty dla openssl_random_pseudo_bytes tutaj , a Dokumenty dla bin2hex tutaj
źródło
Odpowiedź Jeremy'ego jest świetna. Jeśli tak jak ja nie masz pewności, jak zaimplementować funkcję range (), możesz zobaczyć moją wersję za pomocą range ().
<?php $character_array = array_merge(range('a', 'z'), range(0, 9)); $string = ""; for($i = 0; $i < 6; $i++) { $string .= $character_array[rand(0, (count($character_array) - 1))]; } echo $string; ?>
Robi dokładnie to samo, co Jeremy, ale używa scalonych tablic, w których używa łańcucha, i używa count (), gdy używa strlen ().
źródło
range('a','z');
1 linia:
$FROM = 0; $TO = 'zzzz'; $code = base_convert(rand( $FROM ,base_convert( $TO , 36,10)),10,36); echo $code;
źródło
Nowoczesny sposób na zrobienie tego z typem hint / rand_int dla prawdziwej przypadkowości
function random_string(int $size): string { $characters = array_merge( range(0, 9), range('A', 'Z') ); $string = ''; $max = count($characters) - 1; for ($i = 0; $i < $size; $i++) { $string .= $characters[random_int(0, $max)]; } return $string; }
źródło
Najpierw wymień żądane znaki
$chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
Użyj funkcji str_shuffle ($ string). Ta funkcja zapewni losowo przetasowany ciąg.
$alpha=substr(str_shuffle($chars), 0, 50);
50 to długość sznurka.
źródło
public function randomString($length = 8) { $characters = implode([ 'ABCDEFGHIJKLMNOPORRQSTUWVXYZ', 'abcdefghijklmnoprqstuwvxyz', '0123456789', //'!@#$%^&*?' ]); $charactersLength = strlen($characters) - 1; $string = ''; while ($length) { $string .= $characters[mt_rand(0, $charactersLength)]; --$length; } return $string; }
źródło