随机数/字母值

时间:2011-08-11 22:21:29

标签: php random hex

所以我想知道在PHP中生成'十六进制'值的一些好/首选方法是什么?我希望将其限制为5个字符,如下所示:1e1f7

目前我正在做的事情:

echo dechex(mt_rand(10000, 99999));

然而,这给了我4-5个字符长的值,我希望它保持一致的4或5。

有什么方法可以在PHP中更好地生成这样的东西?是否有内置功能?

注意:当我说'十六进制'时,我的意思是字母和数字的随机组合。对可用的信件没有限制。

3 个答案:

答案 0 :(得分:2)

简单的事情:

$length = 5;
$string = "";
while ($length > 0) {
    $string .= dechex(mt_rand(0,15));
    $length -= 1;
}
return $string;

(未测试的)

或者将您的mt_rand范围修复为:mt_rand(65535, 1048575)(十六进制为10000-fffff)或者如果您喜欢锡箔帽:mt_rand(hexdec("10000"), hexdec("ffffff"))

while循环方法的优点是它适用于任意长的字符串。如果你想要32个随机字符,你就会超过整数限制而单个mt_rand将不起作用。

如果你真的只想要随机的东西,我建议:

$length = 5;
$string = "";
$characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-=+!@#$%^&*()[]"; // change to whatever characters you want
while ($length > 0) {
    $string .= $characters[mt_rand(0,strlen($characters)-1)];
    $length -= 1;
}
return $string;

(未测试的)

答案 1 :(得分:1)

echo substr( base64_encode( mt_rand(1000, mt_getrandmax() ), 0, 5);

由于base64,它使用了更多的字母表,但请记住它将包括大写和小写字母以及数字。

答案 2 :(得分:1)

为什么所有工作sha1都经过测试并均匀分布:

substr(sha1(uniqid('moreentropyhere')),0,5);

我用这个来生成数以百万计的uniq uid用于分片表,没有碰撞和非常均匀分布,无论你使用多长...

你甚至可以为基数64使用二进制形式的sha1哈希:

base64_encode(sha1(uniqid('moreentropyhere'), true))

要限制字符,可以使用正则表达式:

substr(preg_replace('~[^a-km-np-z2-9]~','',strtolower(base64_encode(sha1(uniqid(),true)))),0,6)

这里我们限制字符串中的0,1,l(字母)和o(字母),交易一点熵以防止在所有年龄段的入境期间混淆(和服务票)...