2011-08-11 127 views
1

所以我很奇怪什么是一些好的/首选的方法来在PHP中生成“十六进制”的值?最好,我想长时间将其限制为5个字符像这样:1e1f7随机数字/字母值

目前,这是我在做什么:

echo dechex(mt_rand(10000, 99999)); 

但是这给了我4-5个字符长的任意位置的值,我想保持它在一致的4或5.

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

注意:当我说'十六进制'我真的只是意味着随机组合的字母和数字。不必对可用的字母进行限制。

回答

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 = "[email protected]#$%^&*()[]"; // change to whatever characters you want 
while ($length > 0) { 
    $string .= $characters[mt_rand(0,strlen($characters)-1)]; 
    $length -= 1; 
} 
return $string; 

(未经测试)

+0

完美!谢谢。我将使用'mt_rand(65535,1048575)'方法,因为它最适合我的情况。 4分钟内选中对号:p – grep

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

这使用更多的字母因的base64,但请记住,它会包括大写和小写字母以及数字。

+0

不可否认,我对伪随机生成器的了解不多,但仅占前几个字节就可能危及随机性分布。此外,'base64_encode'可能会产生您准备好处理的字符,如'='。 – Halcyon

1

为什么所有的工作SHA1算法的测试,并均匀分布:

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

我已经使用这个产生数以百万计的uniq的uid为分片表,没有冲突也不管您使用的长度显着均匀分布...

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

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(字母),交易有点熵阻止进口为所有年龄段中的困惑(和服务门票)...