PHP中随机长十六进制字符串的生成器

时间:2012-11-18 12:47:14

标签: php generator

我编写了一个字符串生成器,但我不知道如何创建一个长度为 random hex 的字符串,例如100位,用于插入数据库。所有这些字符串的长度必须相同。

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

5 个答案:

答案 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的答案。