php – 生成长度为7个字符的唯一随机字母数字字符

它不一定是有意义的词 – 更像是随机密码生成,但问题是 – 它们应该是唯一的.我会将它用于某种包/产品代码.哪种方法最好? 🙂
最佳答案
通常不可能生成具有唯一和随机元素的序列:显然,该算法必须考虑序列中先前生成的元素,因此下一个元素实际上不是随机的.

因此,您最好的选择是检测碰撞并重试(在您的特定情况下这可能非常昂贵).

如果你只被限制在7个字符,那么上面你可以做的并不多:

$allowed_chars = 'abcdefghijklmnopqrstuvwxz';
$allowed_count = strlen($allowed_chars);
$password = null;
$password_length = 7;

while($password === null || already_exists($password)) {
    $password = '';
    for($i = 0; $i < $password_length; ++$i) {
        $password .= $allowed_chars{mt_rand(0, $allowed_count - 1)};
    }
}

这应该最终会给你一个新密码.

然而,在我遇到的类似情况下,我通常会选择一个更大的密码大小,这也恰好是流行散列函数(例如md5)的十六进制表示的大小.然后,您可以使自己更容易,更不容易出错:

$password = time(); // even better if you have some other "random" input to use here

do {
    $password = md5(time().$password);
}
while (already_exists($password));

这还具有序列空间更大的附加优点,因此将存在更少的冲突.您可以根据将来生成的密码的预期数量来选择散列函数的大小,以“保证”低冲突概率,从而减少对可能昂贵的already_exists函数的调用.

转载注明原文:php – 生成长度为7个字符的唯一随机字母数字字符 - 代码日志