我编写了一个字符串生成器,但我不知道如何创建一个长度为 random hex 的字符串,例如100位,用于插入数据库。所有这些字符串的长度必须相同。
如何生成随机十六进制字符串?
答案 0 :(得分:26)
从PHP 5.3开始:
function getRandomHex($num_bytes=4) {
return bin2hex(openssl_random_pseudo_bytes($num_bytes));
}
对于100位数的示例:
$str = getRandomHex(50);
答案 1 :(得分:2)
像这样:
$val = '';
for( $i=0; $i<100; $i++ ) {
$val .= chr( rand( 65, 90 ) );
}
65是'A'而90是'Z'。或者你可以粘合sha1()
s(其中三个)的输出并减少到100个字符。或者使用md5()
代替(但我坚持sha1()
)。
编辑 sha1()
输出40个字符长字符串,md5()
32个字符长。因此,如果您不想通过char粘贴char(如上面给出的循环),请尝试此函数
function getId( $valLength ) {
$result = '';
$moduleLength = 40; // we use sha1, so module is 40 chars
$steps = round(($valLength/$moduleLength) + 0.5);
for( $i=0; $i<$steps; $i++ ) {
$result .= sha1( uniqid() . md5( rand() . uniqid() ) );
}
return substr( $result, 0, $valLength );
}
其中function参数是要返回的字符串的长度。称之为getId(100);
注意:您必须确保请求字符串不比模块长度更短(对于sha1表示40个字符)。
答案 2 :(得分:2)
$randHexStr = implode( array_map( function() { return dechex( mt_rand( 0, 15 ) ); }, array_fill( 0, $strlen, null ) ) );
其中$ strlen是随机十六进制字符串的长度。
答案 3 :(得分:1)
线性技术这样做,但它的字符串长度方面有点复杂和硬编码。
$ rand4 = substr(sha1(rand(0,getrandmax())),rand(0,24),16);
如果你想改变输出字符串的长度你需要改变函数的最后一个varibale(我设置为16),还有一个rand(0,24),其中数字24会改变根据第三个变量,它不应该超过40-thirdvariable ......
答案 4 :(得分:0)
我喜欢拥有一个可以处理类似情况的通用功能。我的意思是说,一个函数既接收生成的字符串的必需长度,又接收其中可能出现的字符。
这样,一个函数就可以创建:40位十进制数字,16位大写十六进制数字,100个字母小写字符串等...
这是我的实现方式
/**
* Generate a random string.
*
* @param int $length Length of the generated string.
* @param string $chars The string containing all of the available characters.
*
* @return string The generated string.
*/
function getRandomString($length = 10, $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789') {
$str = '';
$size = strlen($chars);
for ($i = 0; $i < $length; $i++) {
$str .= $chars[mt_rand(0, $size - 1)];
}
return $str;
}
重要提示:请勿出于任何安全目的使用此函数生成随机字符串。要获取安全的字符串生成器,请查看@danorton的答案。