生成一个5字符长的字符串0-9 a-z

时间:2010-01-02 21:48:23

标签: php

我需要一个php中的函数,它可以生成一个带有数字和a-z

的5个字符串长的字符串

我应该研究什么?

6 个答案:

答案 0 :(得分:13)

其他人已经为你提供了正确的答案,但这只是一个单行,只是为了它:

$code = substr(str_shuffle('0123456789abcdefghijklmnopqrstuvwxyz'), 0, 5);

str_shuffle随机化上面的字符串,然后substr获取该混洗字符串的前5个字母。简单。


正如此答案的评论中所述,此函数仅生成仅包含唯一字符的字符串。如果有人希望字符串甚至可以“aaaaa”,这里有一个小功能,只允许:

function generate($len) {
    return substr(str_shuffle(str_repeat('0123456789abcdefghijklmnopqrstuvwxyz', $len)), 0, $len);
}

echo generate(5);

str_repeat重复0-9a-z字符串$ len次,所以每个字母对于每个位置都有几乎相同的可能性。 (阅读关于为什么只有“差不多”的评论)

答案 1 :(得分:3)

对于踢球,这是另一种方法:

//create a random base 36 string
$str = base_convert(rand(), 10, 36);

substr并在必要时连接以满足长度要求。

这将给出唯一的字符(例如,'aa11a'将是一个可能的输出) - 这可能是也可能不是OP想要的。此外,您可能需要多次运行该函数以获取所请求长度的字符串这一事实意味着性能可能并不高,但如果您只调用此函数一次或两次,则无关紧要。 这是一个更完整的实现:

function randstr($len) {
  $currLen = 0;
  $value = '';
  while($currLen < $len) {
    $new = base_convert(rand(), 10, 36);
    $value .= $new;
    $currLen += strlen($new);
  }
  //$value may be longer than the requested $len
  return substr($value, 0, $len);
}

值得注意的是,这个字符串将具有不完美的随机性 - base_convert输出的每个字符串的第一个字符将偏向频谱的下端(因为rand()不会完全填充每次都是一个完整的char值。理想情况下,你需要rand中的一些位来完全填充一些base-36 chars。

使用比第一个字符串所需的位数(比如/ dev / urandom)更多的熵源可以解决此问题。但是对于大多数应用程序来说,熵的损失并不足以证明读取/ dev / urandom的开销是合理的。

或者,您可以简单地丢弃每个base_convert()调用的第一个字符。

答案 2 :(得分:1)

你的意思是随机字符串吗?

如果是这样,只需创建一个包含36个字符的字符串,生成5个随机数并根据字符位置创建字符串(伪代码):

string src = "0123456789abcdefghijklmnopqrstuvwxyz"
string dst = ""
for i = 1 to 5:
    dst = dst + src[random(len(src))]

如果您想要5个唯一字符,那么您可以做同样的事情,但只会略有不同。

生成0到35范围内的第一个随机数,第二个在0到34范围内,依此类推。

然后,当您将源字符串中的字符添加到您自己的字符串时,请将源字符串中使用的字符替换为源字符串中的 last 字符。这样可以防止同一个字符被选中两次:

string src = "0123456789abcdefghijklmnopqrstuvwxyz"
int srclen = len(src)
string dst = ""
for i = 1 to 5:
    idx = randon(len(src))
    dst = dst + src[idx]
    src[idx] = src[srclen-1]
    srclen = srclen - 1

除了: @Tatu使用str_shuffle提供了一个简单的解决方案,这是一种更优雅的方式来完成最后一个方法(独特的字符),但我不相信它是最有效的方式,因为它可能涉及大量的掉期以获得一个体面的洗牌。在我看来,这种方法更有可能更快。

如果表现很重要,请记住这一点,但请记住,我没有测试它有多好 - 它可能足够快 - 它甚至可以将我的解决方案从水中吹走:-)与所有与绩效相关的事情,衡量,不要猜测。

答案 3 :(得分:1)

以下是一些示例生成器:

$length = 5;
$charset = '0123456789abcdefghijklmnopqrstuvwxyz';
$str = '';
while ($length--) {
    $str .= $charset[rand() % count($charset)];
}

答案 4 :(得分:0)

http://php.net/manual/en/function.chr.php,如果您不喜欢硬编码字母表。

答案 5 :(得分:0)

另一种方法,用于测试。可以缩短 - 为了便于阅读,这里有点冗长。

function rand_string($length=5) {
    $values = str_split("abcdefghijklmnopqrstuvwxyz0123456789"));
    shuffle($values);
    $values = array_flip($values);

    $string = implode(array_rand($lenght));
    return $string;
}