查看返回的openssl_random_psuedo_bytes()字符串

时间:2013-08-08 23:53:53

标签: php casting return-type php-openssl

为什么echo openssl_random_pseudo_bytes(12)没有打印出任何内容,但如果我用另一个字符串连接它确实显示输出?根据{{​​3}},openssl_random_pseudo_bytes的返回类型是一个字符串,为什么会出现问题?我尝试使用(string)键入它并且它不起作用。

1 个答案:

答案 0 :(得分:0)

openssl_random_pseudo_bytes(...)函数以指定长度的字符串形式(即ASCII值)返回二进制数。

例如,一个可能的输出:

$number_of_bytes = 1;
$bin = openssl_random_pseudo_bytes($number_of_bytes, $cstrong);
$hex=bin2hex($bin);
$dec=hexdec($hex);

可能是:

var_dump($bin); // string(1) "ã"
var_dump($hex); // string(2) "e3"
var_dump($dec); // int(227)
var_dump($cstrong); // bool(true)

注意:

  1. $dec是一个整数随机值,可以等于(最多)2 ^(8 * $ number_of_bytes) - 1。
    • 其中一个字节包含8位
    • PHP的整数溢出限制 最多为2 ^ 31-1或2 ^ 63-1位(使用4个字节或8的有符号整数的限制)字节取决于您是否分别具有32位或64位平台),之后它会溢出/转换为浮点值(可能限制精度)。
      • 所以用4(或8)个字节调用,有一半时间$dec是浮点数
  2. 在更高的字节数下,$bin$hex值保持其精度和准确性(因为所有数字/位都保存在(可变长度)字符串中)。
  3. openssl_random_pseudo_bytes在失败时返回false
  4. $cstrong!==true表示openssl_random_pseudo_bytes未返回加密强算法生成的结果。 (http://php.net/openssl_random_pseudo_bytes

  5. 示例函数(演示处理false返回值或$ cstrong为false时)

    class Random
    {
        public static function Get($number_of_bytes=4)
        {
            $binary_value = openssl_random_pseudo_bytes($number_of_bytes, $cstrong);
    
            // Unable to produce a cryptographically strong value
            if($binary_value==false || $cstrong!==true) return false; // failure
    
            // other processing
            $hexadecimal_value = bin2hex($binary_value);
            $decimal_value = hexdec($hexadecimal_value);  
    
            // Returns a positive integer (or a float 
            // in the case of an integer overflow)
            return $decimal_value; 
        }
    }
    

    手册:http://php.net/openssl_random_pseudo_bytes

    用法

    echo Random::Get(12); // returns a large float value most of the time