一般に、一意の要素とランダムな要素の両方を使用してシーケンスを生成することはできません。明らかに一意であるためには、アルゴリズムはシーケンス内で以前に生成された要素を考慮に入れる必要があるため、次の要素は実際にはランダムではありません。
したがって、最善の策は、衝突を検出して再試行することです(特定のケースでは非常にコストがかかる可能性があります)。
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)};
}
}
これにより、最終的に新しいパスワードが提供されます。
ただし、私が遭遇した同様のケースでは、通常、より大きなパスワードサイズを選択します。これは、一般的なハッシュ関数の16進表現のサイズでもあります(例: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
への呼び出しが少なくなることが「保証」されます。 機能。