我已经编写了一个字符串生成器,但我不知道如何创建一个长度为 100 位的随机十六进制字符串以插入数据库。所有这些字符串必须具有相同的长度。
如何生成随机十六进制字符串?
从带有 OpenSSL 扩展的 PHP 5.3 开始:
function getRandomHex($num_bytes=4) {
return bin2hex(openssl_random_pseudo_bytes($num_bytes));
}
对于您的 100 位数字示例:
$str = getRandomHex(50);
虽然这回答了 OP 的问题,但如果您正在寻找的是random,那么 @danorton 的答案可能更合适。
像这样:
$val = '';
for( $i=0; $i<100; $i++ ) {
$val .= chr(rand(65, 90));
}
65 是A
90 是Z
. 如果您不喜欢“幻数”,则此表格可能更具可读性:
$val = '';
for( $i=0; $i<100; $i++ ) {
$val .= chr(rand(ord('A'), ord('Z')));
}
出于性能原因,我ord()
会将结果设为变量并将其移出循环:
$A = ord('A');
$Z = ord('Z');
$val = '';
for( $i=0; $i<100; $i++ ) {
$val .= chr(rand($A, $Z));
}
或者您可以粘贴sha1()
s 的输出(其中三个)并减少到 100 个字符。或md5()
改用(但我会坚持使用sha1()
)。
EDIT sha1()
输出 40 个字符长的字符串,md5()
32 个字符长。因此,如果您不想按字符粘合字符(如我在上面给出的循环中),请尝试使用此功能
function getId($val_length) {
$result = '';
$module_length = 40; // we use sha1, so module is 40 chars
$steps = round(($val_length/$module_length) + 0.5);
for( $i=0; $i<$steps; $i++ ) {
$result .= sha1(uniqid() . md5(rand());
}
return substr($result, 0, $val_length);
}
其中函数参数是要返回的字符串的长度。称它为getId(100);
$randHexStr = implode( array_map( function() { return dechex( mt_rand( 0, 15 ) ); }, array_fill( 0, $strlen, null ) ) );
其中 $strlen 是随机十六进制字符串的长度。
衬里技术这样做,但就字符串长度而言,它有点复杂和硬编码。
$rand4 = substr(sha1(rand(0,getrandmax())),rand(0,24),16);
如果要更改输出字符串的长度,则需要更改函数的最后一个变量(我设置为 16),另外还有一个 rand(0,24),其中数字 24 将根据第三个更改变量,它不应该超过 40-thirdvariable...
我喜欢有一个可以处理类似情况的通用功能。我的意思是一个函数,它接收生成的字符串的所需长度和其中可能出现的字符。
这样一个函数就可以创建: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 的答案。