중복 될 가능성이 가장 적은 정확한 5 개의 임의 문자열을 만들고 싶습니다. 이를 수행하는 가장 좋은 방법은 무엇입니까? 감사.
답변
$rand = substr(md5(microtime()),rand(0,26),5);
내 추측은 아마도 특수 문자를 찾는 것이 아니라면 다음과 같다.
$seed = str_split('abcdefghijklmnopqrstuvwxyz'
.'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
.'0123456789!@#$%^&*()'); // and any other characters
shuffle($seed); // probably optional since array_is randomized; this may be redundant
$rand = '';
foreach (array_rand($seed, 5) as $k) $rand .= $seed[$k];
그리고 시계를 기반으로 한 경우 (증분이므로 충돌이 적음) :
function incrementalHash($len = 5){
$charset = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
$base = strlen($charset);
$result = '';
$now = explode(' ', microtime())[1];
while ($now >= $base){
$i = $now % $base;
$result = $charset[$i] . $result;
$now /= $base;
}
return substr($result, -5);
}
참고 : 증분은 추측하기 쉽다는 것을 의미합니다. 이것을 솔트 또는 인증 토큰으로 사용하는 경우 사용하지 마십시오. “WCWyb”의 솔트 (현재)는 5 초 후 “WCWyg”임을 의미합니다.)
답변
for
루프가 부족한 경우 사용하고 싶은 것은 다음과 같습니다.
$s = substr(str_shuffle(str_repeat("0123456789abcdefghijklmnopqrstuvwxyz", 5)), 0, 5);
답변
답변
다음과 같이 간단하게 시도 할 수 있습니다.
$length = 5;
$randomletter = substr(str_shuffle("abcdefghijklmnopqrstuvwxyz"), 0, $length);
답변
다음은 중복 가능성을 최소화해야합니다 ( mt_rand()
예 /dev/*random
: GUID 에서 또는 GUID 에서 더 나은 난수 소스 로 대체 할 수 있음 ).
<?php
$characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
$result = '';
for ($i = 0; $i < 5; $i++)
$result .= $characters[mt_rand(0, 61)];
?>
편집 :
당신이 보안에 대해 우려하는 경우, 정말 할 수 없습니다 사용 rand()
하거나 mt_rand()
, 당신의 임의의 데이터 장치가 실제로 발생 장치인지 확인 임의 의 데이터가 아닌 일반 파일 또는 같은 예측 뭔가를 /dev/zero
. mt_rand()
유해한 것으로 간주 :
https://spideroak.com/blog/20121205114003-exploit-information-leaks-in-random-numbers-from-python-ruby-and-php
편집 :
PHP에서 OpenSSL을 지원하는 경우 다음을 사용할 수 있습니다 openssl_random_pseudo_bytes()
.
<?php
$length = 5;
$randomBytes = openssl_random_pseudo_bytes($length);
$characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
$charactersLength = strlen($characters);
$result = '';
for ($i = 0; $i < $length; $i++)
$result .= $characters[ord($randomBytes[$i]) % $charactersLength];
?>
답변
나는 항상 이것에 대해 동일한 기능을 사용하며 일반적으로 암호를 생성합니다. 사용하기 쉽고 유용합니다.
function randPass($length, $strength=8) {
$vowels = 'aeuy';
$consonants = 'bdghjmnpqrstvz';
if ($strength >= 1) {
$consonants .= 'BDGHJLMNPQRSTVWXZ';
}
if ($strength >= 2) {
$vowels .= "AEUY";
}
if ($strength >= 4) {
$consonants .= '23456789';
}
if ($strength >= 8) {
$consonants .= '@#$%';
}
$password = '';
$alt = time() % 2;
for ($i = 0; $i < $length; $i++) {
if ($alt == 1) {
$password .= $consonants[(rand() % strlen($consonants))];
$alt = 0;
} else {
$password .= $vowels[(rand() % strlen($vowels))];
$alt = 1;
}
}
return $password;
}
답변
str_shuffle 이 이것을 위해 좋은 사용이 될 것 같습니다 . 원하는 캐릭터로 셔플을 시드하십시오.
$my_rand_strng = substr(str_shuffle("ABCDEFGHIJKLMNOPQRSTUVWXYZ"), -5);