php – 使用openssl_random_pseudo_bytes()替换rand()

我需要替换PHP的rand()函数,该函数使用密码强的随机数生成器.

openssl_random_pseudo_bytes()函数可以访问强大的随机数生成器,但它会以字节串的形式输出数据.相反,我需要一个介于0和X之间的整数.

我想象的关键是将openssl_random_pseudo_bytes()的输出转换成一个整数,然后你可以对它进行任何数学运算.我可以想到从字节字符串转换为整数的几种“强力”方式,但我希望有一些优雅的东西.

使用提供的建议,我已经使用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;
}
http://stackoverflow.com/questions/1313223/replace-rand-with-openssl-random-pseudo-bytes

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:php – 使用openssl_random_pseudo_bytes()替换rand()