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

Това в крайна сметка трябва да ви даде нова парола.

Въпреки това, в подобни случаи, които съм срещал, обикновено избирам по-голям размер на паролата, който също е размерът на шестнадесетичното представяне на популярна хеш функция (напр. 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Срив на MySQL контейнер след промяна на /etc/mysql/my.cnf, как да редактирам обратно?

  2. Java+Tomcat, Умираща връзка с базата данни?

  3. Как да използвам mysql JOIN без условие ON?

  4. Предупреждение:mysqli_query() очаква параметър 1 да бъде даден mysqli булев

  5. Условия за състезание на MySQL