PHP / MySQL – лучший способ создать уникальную случайную строку?

Как создать случайную уникальную строку в MySQL?

когда мне нужно создать случайную строку в PHP, я использую эту функцию:

public function generateString($length) { $charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; for($i=0; $i<$length; $i++) $key .= $charset[(mt_rand(0,(strlen($charset)-1)))]; return $key; } 

Затем я возьму сгенерированную строку и сохраню ее в базе данных MySQL.

Каков наилучший способ убедиться, что сгенерированная случайная строка уникальна для всех других случайных строк, созданных для других записей в базе данных?

Может, что-то вроде этого?

 while(++$i < 100) { //query db with random key to see if there is a match //if no match found break out of loop break; } 

Это кажется грязным и длинным, и я могу потенциально ударить по базе данных несколько раз. Как я могу быстро убедиться, что моя новая случайная строка уникальна?

Solutions Collecting From Web of "PHP / MySQL – лучший способ создать уникальную случайную строку?"

Предполагая, что 10 символов из набора символов az, AZ, 0-9 означают, что существует (26 + 26 + 10) 10 = 8.39299366 × 10 17 возможных комбинаций. Чтобы вычислить вероятность столкновения … просто 1 / x вышеупомянутое число. Поэтому я бы не стал беспокоиться о том, чтобы получить одну и ту же строку дважды. Даже если вы снова получите одну и ту же строку, я снова запустил функцию в цикле, единственным условием выхода является то, что найдена уникальная строка.

Почему бы просто не использовать встроенные функции для генерации уникальных идентификаторов? Вам не придется беспокоиться о дубликатах таким образом.

И PHP, и MySQL имеют свои собственные.

PHP: uniqid()

MySQL: UUID()

SET rand_str = SUBSTRING(MD5(NOW()),1,$LENGTH); – Где ДЛИНА составляет от 1 до 32 в соответствии с MD5

Ниже приведены некоторые примеры:

SET rand_str = SUBSTRING(MD5(NOW()),1,5); – 5 символов

SET rand_str = SUBSTRING(MD5(NOW()),1,15); – 15 символов

Взгляните на функцию uniqid и расширение pecl uuid . Любой из них можно использовать в качестве основы для генерации графиков, хотя, если вы планируете создать кластер, вы захотите убедиться, что у вас есть что-то дополнительное, что гарантирует, что два сервера не будут генерировать один и тот же идентификатор. Для конфигурации этой проблемы достаточно иметь конфигурацию на каждый сервер, которая добавляет в качестве префикса или суффикса идентификатор.

К счастью, базы данных уже имеют возможность создавать уникальные идентификаторы (числовые). Я предлагаю подход, который мы использовали, чтобы создать двустороннее преобразование между слегка увеличивающимся числовым идентификатором и буквенно-цифровым идентификатором. Имея это двустороннее подтверждение, альфа-числовые «случайные» версии также уникальны, не проверяя их явно. Действительно, я только когда-либо храню числовую версию в базе данных (так как вы бесплатно получаете ее с столбцом SERIAL) и только когда-либо печатаете альфа-версию.

В этом примере генерируются семибайтовые идентификаторы, но подход может быть тривиально изменен, чтобы соответствовать практически любым обстоятельствам.

См.: Как создать уникальный идентификатор в MySQL?

Я бы сделал столбец этого идентификатора уникальным в вашей БД. Тогда вы можете сделать что-то подобное для защиты от столкновений:

  $row_count = 0; while ($row_count == 0) { error_reporting(0); $id_string = substr(uniqid(), 0, 10); $sql = "UPDATE <table> SET unique_id = :unique_id WHERE <something true>"; $query = $this->db->prepare($sql); $query->execute(array(':unique_id' => $unique_id)); $row_count = $query->rowCount(); } 

Конечно, возможно, вам придется попробовать запрос более одного раза, но таким образом вы знаете, что он гарантированно будет уникальным в вашей БД. Строка error_reporting (0) предназначена для подавления любых предупреждений, которые могут быть включены. Утилита uniqid () также не является самой уникальной в своем роде, но вы можете легко заменить ее самостоятельно или просто поразить потенциальные столкновения здесь и там.

Обычно я использую:

 SELECT LEFT(MD5(id), 8) 

варианты по потребностям:

 SELECT LEFT(UUID(), 8) SELECT LEFT(MD5(RAND()), 8) 

Если вы хотите использовать эти строки для целей безопасности, вы должны использовать openssl_random_pseudo_bytes, который укажет вам, сможет ли PHP использовать сильный алгоритм для его создания:

Однако Ouput нуждается в чистке. Посмотрите на этот вопрос для получения дополнительной информации.

Уникальные случайные строки могут использоваться в качестве символьных клавиш или жетонов для идентификации записей базы данных и проверки таблицы базы данных и предоставления уникального ключа с переменной $ refer_by.

 define('DB_SERVER', "localhost"); define('DB_USER', "root"); define('DB_PASS', ""); define('DB_DATABASE', "student"); $con = mysqli_connect(DB_SERVER, DB_USER, DB_PASS, DB_DATABASE); function refercode() { $string = ''; $characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; $max = strlen($characters) - 1; for ($i = 0; $i < 6; $i++) { $string .= $characters[mt_rand(0, $max)]; } $refer = "select * from user_detail where refer_code = '".$string."' "; $coderefertest = mysqli_query($con,$refer); if(mysqli_num_rows($coderefertest)>0) { return refercode(); } else { return $string; } } $refer_by = refercode();