sql >> Databasteknik >  >> RDS >> Mysql

Skapa unika slumpmässiga alfanumeriska tecken som är 7 tecken långa

Det är i allmänhet inte möjligt att generera sekvenser med både unika och slumpmässiga element:uppenbarligen för att vara unik måste algoritmen ta hänsyn till de tidigare genererade elementen i sekvensen, så de nästa blir inte riktigt slumpmässiga.

Det bästa är därför att upptäcka kollisioner och bara försöka igen (vilket kan bli mycket dyrt i just ditt fall).

Om du är begränsad till bara 7 tecken, finns det inte mycket du kan göra ovan:

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

Detta bör så småningom ge dig ett nytt lösenord.

Men i liknande fall jag har stött på väljer jag vanligtvis en större lösenordsstorlek som också råkar vara storleken på hex-representationen av en populär hashfunktion (t.ex. md5 ). Då kan du göra det lättare för dig själv och mindre felbenägen:

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

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

Detta har också den extra fördelen att sekvensutrymmet är större, varför det blir färre kollisioner. Du kan välja storleken på hashfunktionen enligt det förväntade antalet lösenord som du kommer att generera i framtiden för att "garantera" en låg kollisionssannolikhet och därmed färre anrop till den eventuellt dyra already_exists funktion.



  1. QueryException SQLSTATE[HY000] [1045] Åtkomst nekad för användaren 'homestead'@'localhost' (med lösenord:JA)

  2. Laravel 5.4 uppgradering, konverterar till utf4mb från utf8

  3. Hur OBJECTPROPERTYEX() fungerar i SQL Server

  4. Hur får jag en MySQL-databas att köras helt i minnet?