sql >> Database >  >> RDS >> Mysql

Genereer unieke willekeurige alfanumerieke tekens die 7 tekens lang zijn

Het is over het algemeen niet mogelijk om reeksen te genereren met zowel unieke als willekeurige elementen:om uniek te zijn, moet het algoritme natuurlijk rekening houden met de eerder gegenereerde elementen in de reeks, dus de volgende zullen niet echt willekeurig zijn.

Daarom kunt u het beste botsingen detecteren en het gewoon opnieuw proberen (wat in uw specifieke geval erg duur kan zijn).

Als je beperkt bent tot slechts 7 tekens, kun je hierboven niet veel doen:

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

Dit zou u uiteindelijk een nieuw wachtwoord moeten opleveren.

In soortgelijke gevallen die ik ben tegengekomen, kies ik echter meestal een grotere wachtwoordgrootte, wat ook de grootte is van de hex-representatie van een populaire hash-functie (bijv. md5 ). Dan kunt u het uzelf gemakkelijker maken en minder foutgevoelig:

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

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

Dit heeft ook als bijkomend voordeel dat de sequentieruimte groter is, waardoor er minder botsingen zullen zijn. U kunt de grootte van de hash-functie kiezen op basis van het verwachte aantal wachtwoorden dat u in de toekomst zult genereren om een ​​lage kans op botsingen te "garanderen" en dus minder aanroepen naar de mogelijk dure already_exists functie.



  1. Hoe SQL-query's te versnellen

  2. ontleden resultaten in MySQL via REGEX

  3. Waarom stopt mijn cfloop na het invoegen van de eerste id?

  4. Hoe dubbelzinnige kolomnamen op te lossen bij het ophalen van resultaten?