0

为什么不echo openssl_random_pseudo_bytes(12)打印任何内容,但如果我将它与另一个字符串连接它会显示输出?根据手册,返回类型openssl_random_pseudo_bytes是字符串,为什么会有问题?我尝试使用它进行类型转换,(string)但它没有用。

4

1 回答 1

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_bytesfalse失败时返回。
  4. $cstrong!==true指示openssl_random_pseudo_bytes未返回由加密强算法生成的结果。( http://php.net/openssl_random_pseudo_bytes )

示例函数(演示处理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
于 2014-02-19T10:45:03.600 回答