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值的函数相比,函数似乎工作得很快,但我关注的是我的实现的"质量".我对密码学知之甚少,所以我想问一下这种函数是否会产生"好的"随机值.
mcrypt_create_iv似乎返回某种随机二进制值,实际上用于使用mcrypt库加密/解密数据.什么是base64_encode对这种二进制数据的影响,当我base64_encode时,我实际上是否减少了熵?
第二个参数如何mcrypt_create_iv影响我的结果?php.net手册说明MCRYPT_RAND是'系统随机数生成器'.它是特定于操作系统的,如果是,那么创建了多少好的值?
对于任何寻找“最佳”算法更新版本的人:
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与其他解决方案相比,它提供了完整的字母范围(小写和大写)。
这应该在大多数系统上安全且快速:
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)
base64_encoding 不会减少熵,它只是相同数据的不同表示。
这是特定于操作系统的,但我认为创建的随机值对于这个函数来说已经足够好了。在 PHP 5.3 下,您必须事先为生成器播种,如果您在不同的服务器上使用此代码,可能会出现问题。
| 归档时间: |
|
| 查看次数: |
5599 次 |
| 最近记录: |