Генерация уникальных значений для уникальных полей MySQL

Например, когда пользователь регистрируется на моем веб-сайте, я создаю уникальную строку длиной 40 и вставляю ее в базу данных. Затем мы отправляем электронное письмо недавно зарегистрированному пользователю, содержащее эту уникальную строку в виде URL-адреса, и все это прекрасно работает.
Но как вы создаете и вставляете эту сущность регистрации, гарантируя, что поле с уникальным свойством действительно уникально?

Мой текущий подход заключается в следующем:

$key = '';
$repeat = true;
while ($repeat) {
$key = generate_hash(40);
$is_unique = (count($model->get_by_key($key)) === 0) ? true : false;
$repeat = ($is_unique) ? false : true;
}
// At this point I know the key is unique and can insert it...

Я не доволен этим кодом, так как стараюсь избегать циклов while в целом. Есть ли лучший способ добиться того, что я делаю здесь?

Суть в том, что поле MySQL, содержащее эти ключи, обладает уникальным свойством, и мне нужно знать, что при вставке этих ключей не будет происходить уникальных нарушений.

2

Решение

Хорошо, в основном у вас есть два подхода.

  1. Позвольте БД справиться с этим и использовать UUID () создать уникальный идентификатор, который вы можете использовать в письмах.

    В зависимости от вашей версии MySQL у вас есть несколько вариантов:

    A. С MySQL 4.1 и выше вы можете использовать функцию непосредственно с INSERT INTO:

    INSERT INTO table_name
    (unique_id, field1, field2)
    VALUES
    (UUID(), "smth", "smth")
    

    B. С MySQL 5.0 Вы можете создать TRIGGER и автоматически заполнить уникальное поле при вставке:

    CREATE TRIGGER
    unique_id
    BEFORE INSERT ON
    table_name
    FOR EACH ROW
    SET NEW.unique_id = UUID()
    
  2. Вы можете программно проверить, является ли сгенерированный идентификатор действительно уникальным. То же самое вы делаете сейчас, но вы можете немного изменить код:

    $key = generate_hash(40);
    while ( count($model->get_by_key($key)) ) {
    $key = generate_hash(40);
    }
    
    //here you have an unique id in $key
    
3

Другие решения

Для этого есть встроенные уникальные функции идентификатора почти на всех языках.

echo uniqid();
0

Вы можете генерировать 256 ^ 40 различных 40-символьных строк.
Солнце взорвется, прежде чем вы создадите 2 одинаковые строки.

0

Ты можешь использовать md5(time()) как ваша уникальная ценность вместо. md5 из time не будет одинаковым для каждого отправляющего пользователя.

$time = time();
$md5 = md5($time);

Пока md5() просто содержит 32 строки длины, вы можете добавить уникальное слово после md5(),

$unique = $md5."uniq1234";

Теперь у вас есть 40 уникальных строк. Наконец вы можете добавить $unique как ваше уникальное значение в базе данных

0

Вы можете использовать эту функцию для генерации uniqueID,

function keygen($length=10)
{
$key = '';
list($usec, $sec) = explode(' ', microtime());
mt_srand((float) $sec + ((float) $usec * 100000));

$inputs = array_merge(range('z','a'),range(0,9),range('A','Z'));

for($i=0; $i<$length; $i++)
{
$key .= $inputs{mt_rand(0,61)};
}
return $key;
}

echo keygen(10);
-1
По вопросам рекламы [email protected]