PHP에서 'd79jd8c'와 같은 (의사) 임의의 영숫자 문자열을 생성하려면 어떻게해야합니까?
PHP에서 'd79jd8c'와 같은 (의사) 임의의 영숫자 문자열을 생성하려면 어떻게해야합니까?
답변:
먼저 가능한 모든 문자로 문자열을 만드십시오.
$characters = 'abcdefghijklmnopqrstuvwxyz0123456789';
range () 를 사용 하여 더 빨리 할 수도 있습니다 .
그런 다음 루프에서 임의의 숫자를 선택하고 $characters문자열에 대한 인덱스로 사용 하여 임의의 문자를 가져 와서 문자열에 추가합니다.
$string = '';
$max = strlen($characters) - 1;
for ($i = 0; $i < $random_string_length; $i++) {
$string .= $characters[mt_rand(0, $max)];
}
$random_string_length 무작위 문자열의 길이입니다.
strlen()각 반복을 실행 하는 것은 좋지 않습니다. strlen($characters) - 1변수에 할당 하고주기에서 strlen을 수행합니다. 이 경우 중요하지는 않지만 Mauvais ton 입니다.
openssl_random_pseudo_bytes 함수를 사용하여 암호화 된 강력한 임의의 (잠재적으로) 8 자 문자열을 생성합니다 .
echo bin2hex(openssl_random_pseudo_bytes(4));
절차 적 방법 :
function randomString(int $length): string
{
return bin2hex(openssl_random_pseudo_bytes($length));
}
최신 정보:
PHP7은 random_x()더 나은 기능을 도입했습니다 . PHP 5.X에서 온 경우 PHP 7의 random_bytes () 및 random_int ()에 대한 폴리 필인 우수한 paragonie / random_compat 라이브러리를 사용하십시오 .
function randomString($length)
{
return bin2hex(random_bytes($length));
}
ASCII 테이블 을 사용하여 문자 범위를 선택하십시오. 여기서 $ range_start, $ range_end는 ASCII 테이블의 10 진수 열 값입니다.
이 방법은 문자 범위가 다른 문자열 내에서 특별히 정의 된 방법에 비해 더 좋습니다.
// 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;
더보기:
나는 그것이 오래된 게시물이라는 것을 알고 있지만 Jeremy Ruten의 답변을 기반으로 만들고 의견 제안으로 개선 된 수업에 기여하고 싶습니다.
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;
}
}
아마도 여기에서 뭔가를 놓쳤을 수도 있지만 여기에 uniqid () 함수를 사용하는 방법이 있습니다 .
uniqid어떤 식 으로든 무작위가 아닙니다. 완전히 예측 가능합니다. 이 질문은 매우 구체적으로 의사 난수 문자열을 찾고 있습니다.
기능을 가지고 놀기 위해 다음과 같은 빠른 기능을 만들었습니다 range(). 언젠가 누군가를 도울 수 있습니다.
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;
}
다음 코드를 사용할 수 있습니다. 특수 문자 수를 강제 할 수 있다는 점을 제외하면 기존 함수와 유사합니다.
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);
}
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();
Jeremy의 대답은 훌륭합니다. 저처럼 range ()를 구현하는 방법을 잘 모르겠다면 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;
?>
이것은 Jeremy와 똑같은 일을하지만 그가 문자열을 사용하는 병합 배열을 사용하고 strlen ()을 사용하는 count ()를 사용합니다.
range('a','z');
실제 임의성을 위해 유형 힌트 / rand_int로이를 수행하는 현대적인 방법
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;
}
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;
}