基本上,我正在寻找一个函数来执行以下操作。
generateToken(128)
这将返回一个由整数或字母字符组成的128位字符串。
澄清一下:根据评论,我必须修改问题。显然,如果需要128位,则我正在寻找一个长度为16个字符的字符串。
generateToken(128)
这将返回一个由整数或字母字符组成的128位字符串。
澄清一下:根据评论,我必须修改问题。显然,如果需要128位,则我正在寻找一个长度为16个字符的字符串。
openssl_random_pseudo_bytes
将给出一串随机字节,你可以使用 bin2hex
进行编码,否则可以在自己的令牌生成例程中使用 mt_rand
。openssl_random_pseudo_bytes
生成解决方案所需的正确数量的比特,即 128(16 字节)。然后你可以用任何你认为合适的方式进行编码,十六进制和 Base64 是两个可能性。openssl_random_pseudo_bytes
不会给出十六进制编码表示。不管怎样,这是一个很好的解决方案。之后,只需要使用例如 bcmath 来构建以十进制字符串表示的数字即可。 - Artefactobin2hex
这一部分 :) - Cameron Skinner从 PHP 5.3 开始:
$rand128 = bin2hex(openssl_random_pseudo_bytes(16));
random_bytes
而不是 openssl_random_pseudo_bytes
。 - caw你的目的是什么?
如果你只想要一个唯一的ID,那么可以使用uniqid函数:
http://www.php.net/manual/en/function.uniqid.php
这不是随机的,而是基于微秒的十六进制字符串。如果您执行uniqid('', true),那么它将返回一个基于微秒的十六进制字符串,并在ID末尾附加一堆随机数字(因此,即使两个呼叫在同一微秒内到达,它们也不太可能共享唯一的ID)。
如果您需要确切的16个字符的字符串,那么目的是什么?您是否在处理密码?该字符串应有多随机?总而言之,您可以始终只需执行:
$toShow = array();
for($i = 0; $i<16; $i++){
$toShow[] = chr(mt_rand(ord('a'), ord('z')));
}
return $toShow