Как создать случайную уникальную строку в 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; }
Это кажется грязным и длинным, и я могу потенциально ударить по базе данных несколько раз. Как я могу быстро убедиться, что моя новая случайная строка уникальна?
Предполагая, что 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();