sql >> Databáze >  >> RDS >> Mysql

Vygenerujte jedinečné náhodné alfanumerické znaky o délce 7 znaků

Obecně není možné generovat sekvence s jedinečnými i náhodnými prvky:aby byl algoritmus jedinečný, musí samozřejmě vzít v úvahu dříve vygenerované prvky v sekvenci, takže ty další nebudou ve skutečnosti náhodné.

Nejlepším řešením by proto bylo detekovat kolize a prostě to zkusit znovu (což může být ve vašem konkrétním případě velmi drahé).

Pokud jste omezeni na pouhých 7 znaků, výše toho moc dělat nemůžete:

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

Tím byste nakonec měli získat nové heslo.

V podobných případech, se kterými jsem se však setkal, obvykle volím větší velikost hesla, která je shodou okolností také velikosti hexadecimální reprezentace oblíbené hashovací funkce (např. md5 ). Pak si to můžete usnadnit a méně náchylné k chybám:

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

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

To má také další výhodu, že sekvenční prostor je větší, a proto bude méně kolizí. Velikost hashovací funkce si můžete vybrat podle očekávaného počtu hesel, která v budoucnu vygenerujete, abyste "zaručili" nízkou pravděpodobnost kolize a tím méně volání na možná drahé already_exists funkce.



  1. Jak mohu zřetězit celé sady výsledků v MySQL?

  2. Připojení k MySQL pomocí Pythonu

  3. (Čeština) Jak používat Oracle Database 19c Pre-Built Developer VM

  4. jak zkontrolovat, zda dotaz mysql nevrací žádný výsledek (záznam nenalezen) pomocí php?