Подтвердить что ты не робот

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;

}

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

PHP: uniqid()

MySQL: UUID()

Ответ 3

SET rand_str = SUBSTRING(MD5(NOW()),1,$LENGTH); - где LENGTH составляет от 1 до 32 в соответствии с MD5

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

SET rand_str = SUBSTRING(MD5(NOW()),1,5); - строка с 5 символами

SET rand_str = SUBSTRING(MD5(NOW()),1,15); - строка с 15 символами

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

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

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

Ответ 7

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

SELECT LEFT(MD5(id), 8)

по желанию:

SELECT LEFT(UUID(), 8)

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

Ответ 8

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

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

Ответ 9

Уникальные случайные строки могут использоваться в качестве символьных клавиш или жетонов для идентификации записей базы данных и проверки таблицы базы данных и предоставления уникального ключа с переменной $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();