PHP快速随机字符串功能

Mik*_*ikk 7 php string random performance cryptography

我需要快速的方法在PHP中生成随机字符串a-Z0-9.我一直在做一些思考和测试,这是我到目前为止所做的:

function randStr($length) {
    $result = null;
    $replace = array('/', '+', '=');
        while(!isset($result[$length-1])) {
        $result.= str_replace($replace, NULL, base64_encode(mcrypt_create_iv($length, MCRYPT_RAND)));
        }
    return substr($result, 0, $length);
}
Run Code Online (Sandbox Code Playgroud)

与为每个char迭代并选择随机ASCII值的函数相比,函数似乎工作得很快,但我关注的是我的实现的"质量".我对密码学知之甚少,所以我想问一下这种函数是否会产生"好的"随机值.

  1. mcrypt_create_iv似乎返回某种随机二进制值,实际上用于使用mcrypt库加密/解密数据.什么是base64_encode对这种二进制数据的影响,当我base64_encode时,我实际上是否减少了熵?

  2. 第二个参数如何mcrypt_create_iv影响我的结果?php.net手册说明MCRYPT_RAND是'系统随机数生成器'.它是特定于操作系统的,如果是,那么创建了多少好的值?

Jos*_*eph 6

对于任何寻找“最佳”算法更新版本的人:

function randomString($length) {
   $result = null;
   $replace = array('/', '+', '=');
   while(!isset($result[$length-1])) {
      $result.= str_replace($replace, NULL, base64_encode(random_bytes($length)));
   }
   return substr($result, 0, $length);
}
Run Code Online (Sandbox Code Playgroud)

我使用术语“最佳”,因为它比 和 的随机字符串操作更快,rstr1并且rstr2与其他解决方案相比,它提供了完整的字母范围(小写和大写)。


Afa*_*kin 5

这应该在大多数系统上安全且快速:

bin2hex(openssl_random_pseudo_bytes($length / 2));
Run Code Online (Sandbox Code Playgroud)

基准测试(1000000条记录,字符串长度100个字符)

rstr1: 198.93383002281
rstr2: 35.5827729702
rstr3: 6.8811790943146
rstr4: 5.4545040130615
this:: 3.9310231208801
Run Code Online (Sandbox Code Playgroud)


kap*_*apa 3

  1. base64_encoding 不会减少熵,它只是相同数据的不同表示。

  2. 这是特定于操作系统的,但我认为创建的随机值对于这个函数来说已经足够好了。在 PHP 5.3 下,您必须事先为生成器播种,如果您在不同的服务器上使用此代码,可能会出现问题。