在PHP中生成一个真正随机的字符串

时间:2013-11-16 11:48:06

标签: php random

我需要为客户端生成数千(可能是数百万)个唯一代码。这些代码可能具有货币价值,因此它们必须是随机的,并且聪明的黑客不会发现和利用任何模式。

我已经研究了生成代码的各种解决方案(循环生成=可能被猜测,风险太大,uniqid() =好,但我可能需要不同长度的代码。)

现在我正在考虑使用AZ和0-9 MINUS VOWELS生成代码(为了确保不会意外生成粗鲁的单词),尽管将来可能会增加小写字符等。

到目前为止,我有这个:

编辑:Per @ kingero的评论,在下面,我已经提升了一个解决方案中的随机性,因为mt_rand取代function generateCode($length = 12) { $chars = 'BCDFGHJKLMNPQRSTVWXYZ0123456789'; $count = mb_strlen($chars); for ($i = 0, $result = ''; $i < $length; $i++) { $randomIndex = devurandom_rand(0, $count - 1); $result .= mb_substr($chars, $randomIndex, 1); } return $result; } // CUSTOM RAND FUNCTION // equiv to rand, mt_rand // returns int in *closed* interval [$min,$max] function devurandom_rand($min = 0, $max = 0x7FFFFFFF) { $diff = $max - $min; if ($diff < 0 || $diff > 0x7FFFFFFF) { throw new RuntimeException("Bad range"); } $bytes = mcrypt_create_iv(4, MCRYPT_DEV_URANDOM); if ($bytes === false || strlen($bytes) != 4) { throw new RuntimeException("Unable to get 4 bytes"); } $ary = unpack("Nint", $bytes); $val = $ary['int'] & 0x7FFFFFFF; // 32-bit safe $fp = (float) $val / 2147483647.0; // convert to [0,1] return round($fp * $diff) + $min; } 的自定义rand函数:

{{1}}

这是非常基本的,所以我显然担心它不够随意。谁能告诉我这是否是确保生成的代码真正随机的好方法?

(注意:显然,一个想成为黑客的黑客总是可以尝试进行暴力攻击。这种尝试将在别处处理,我只是想确保这些代码真的是随机的。)

1 个答案:

答案 0 :(得分:1)

我使用以下实现,希望对您有用:

function createRandStr($length, $spChars = false){
        $alpha = 'abcdefghijklmnopqrstwvxyz';
        $alphaUp = strtoupper($alpha);
        $num = '12345678901234567890';
        $sp = '@/+.*-\$#!)[';
        $thread = $alpha.$alphaUp.$num;
        if ($spChars) $thread .= $sp;
        $str = '';
        for ($i = 0; $i < $length; $i++){
            $str .= $thread[mt_rand(0, strlen($thread)-1)];
        }
        return $str;

    } 

查看此直播演示:http://codepad.org/QnvP7fFl