, 나는 드롭을 만들었습니다 - OpenSSL을 사용하여 rand()를 대체했습니다. 나는 여기에 후손을 포함시킬 것이다.
$ pedantic 옵션은 결과가 가능한 범위에서 균등하게 분배되지 않을 때 다시 시작하여 바이어스없는 결과를 제공합니다.
function crypto_rand($min,$max,$pedantic=True) {
$diff = $max - $min;
if ($diff <= 0) return $min; // not so random...
$range = $diff + 1; // because $max is inclusive
$bits = ceil(log(($range),2));
$bytes = ceil($bits/8.0);
$bits_max = 1 << $bits;
// e.g. if $range = 3000 (bin: 101110111000)
// +--------+--------+
// |....1011|10111000|
// +--------+--------+
// bits=12, bytes=2, bits_max=2^12=4096
$num = 0;
do {
$num = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes))) % $bits_max;
if ($num >= $range) {
if ($pedantic) continue; // start over instead of accepting bias
// else
$num = $num % $range; // to hell with security
}
break;
} while (True); // because goto attracts velociraptors
return $num + $min;
}
에는, mt_rand를()() (. 당신은 즉, 업그레이드 한 가정)하지만 중 하나를 강력하게 암호화 아니다. – David
조심해서 대답하십시오. 보다 구체적으로 "% $ range"부분이 올바르지 않습니다. 다음 시나리오를 고려하십시오. 1부터 4까지의 숫자를 생성하고 싶습니다 (최대 - 최소 시간을 수행하기 때문에). $ 범위 = 3. 이제 3 1 3. 매우주의보다 더 많이 될 것입니다 것을 2^8 의미로 균등하게 분할하지 않습니다, 당신은 안전한 난수 생성기를 만들고 싶어하지만 실수가 불안했다, 이것은 왜 기존 구현을 사용하는 것이 좋습니다. – chacham15
는 chacham15 @ : 제대로 이해하고, 8 비트 범위에서 당신은 "보다 출현하는"1 "에 대한 1.17 %의 가능성이있어 남은 [1,2,3] 플러스 하나 [1]의 85 개 세트를 얻을 수 2 "또는"3 ", 맞습니까? 이 문제를 어떻게 풀려고합니까? 분명히 * 기존 구현 *을 사용하는 것은 옵션이 아니거나 질문하지 않았을 것입니다. – tylerl