15

我已经编写了一个字符串生成器,但我不知道如何创建一个长度为 100 位的随机十六进制字符串以插入数据库。所有这些字符串必须具有相同的长度。

如何生成随机十六进制字符串?

4

5 回答 5

39

从带有 OpenSSL 扩展的 PHP 5.3 开始:

function getRandomHex($num_bytes=4) {
  return bin2hex(openssl_random_pseudo_bytes($num_bytes));
}

对于您的 100 位数字示例:

$str = getRandomHex(50);
于 2014-02-28T19:33:37.707 回答
6

虽然这回答了 OP 的问题,但如果您正在寻找的是random,那么 @danorton 的答案可能更合适。


像这样:

$val = '';
for( $i=0; $i<100; $i++ ) {
   $val .= chr(rand(65, 90));
}

65 是A90 是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);

于 2012-11-18T12:51:37.213 回答
5
$randHexStr = implode( array_map( function() { return dechex( mt_rand( 0, 15 ) ); }, array_fill( 0, $strlen, null ) ) );

其中 $strlen 是随机十六进制字符串的长度。

于 2014-07-15T11:30:42.120 回答
1

衬里技术这样做,但就字符串长度而言,它有点复杂和硬编码。

$rand4 = substr(sha1(rand(0,getrandmax())),rand(0,24),16);

如果要更改输出字符串的长度,则需要更改函数的最后一个变量(我设置为 16),另外还有一个 rand(0,24),其中数字 24 将根据第三个更改变量,它不应该超过 40-thirdvariable...

于 2013-02-21T13:39:57.917 回答
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 的答案。

于 2020-05-29T00:37:01.583 回答