sql >> データベース >  >> RDS >> Mysql

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)};
        }
    }
    

    これにより、最終的に新しいパスワードが提供されます。

    ただし、私が遭遇した同様のケースでは、通常、より大きなパスワードサイズを選択します。これは、一般的なハッシュ関数の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への呼び出しが少なくなることが「保証」されます。 機能。



    1. 最適化のしきい値–データのグループ化と集約、パート4

    2. JavaScript/Node.jsでのSQLインジェクションの防止

    3. MySQLルートパスワードの変更

    4. Accessのクロス集計クエリで欠落しているフィールドを修正する方法