所以我很奇怪什么是一些好的/首选的方法来在PHP中生成“十六进制”的值?最好,我想长时间将其限制为5个字符像这样:1e1f7
随机数字/字母值
目前,这是我在做什么:
echo dechex(mt_rand(10000, 99999));
但是这给了我4-5个字符长的任意位置的值,我想保持它在一致的4或5.
有什么方法可以在PHP中更好地生成这样的东西?是否还有内置功能?
注意:当我说'十六进制'我真的只是意味着随机组合的字母和数字。不必对可用的字母进行限制。
所以我很奇怪什么是一些好的/首选的方法来在PHP中生成“十六进制”的值?最好,我想长时间将其限制为5个字符像这样:1e1f7
随机数字/字母值
目前,这是我在做什么:
echo dechex(mt_rand(10000, 99999));
但是这给了我4-5个字符长的任意位置的值,我想保持它在一致的4或5.
有什么方法可以在PHP中更好地生成这样的东西?是否还有内置功能?
注意:当我说'十六进制'我真的只是意味着随机组合的字母和数字。不必对可用的字母进行限制。
一些东西:
$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;
(未经测试)
echo substr(base64_encode(mt_rand(1000, mt_getrandmax()), 0, 5);
这使用更多的字母因的base64,但请记住,它会包括大写和小写字母以及数字。
不可否认,我对伪随机生成器的了解不多,但仅占前几个字节就可能危及随机性分布。此外,'base64_encode'可能会产生您准备好处理的字符,如'='。 – Halcyon
为什么所有的工作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(字母),交易有点熵阻止进口为所有年龄段中的困惑(和服务门票)...
完美!谢谢。我将使用'mt_rand(65535,1048575)'方法,因为它最适合我的情况。 4分钟内选中对号:p – grep