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

Я программирую скрипт с использованием PHP и MySQL, и я хочу получить уникальный идентификатор (состоящий из строки: capitals и small letters with numbers), например: gHYtUUi5b . Я нашел много функций в PHP, которые могут генерировать такие числа, но я боюсь, как обеспечить уникальный идентификатор!

UPDATE : uuid длинный, я имею в виду такой идентификатор, как: (P5Dc) 11 буквенно-цифровых символов.

Программным способом может быть:

  • добавьте УНИКАЛЬНЫЙ ИНДЕКС в поле
  • генерировать случайную строку в PHP
  • цикл в PHP (while (! DO_THE_INSERT))
    • сгенерировать другую строку

Заметка:

  • Это может быть грязным, но имеет преимущество быть DBMS-агностиком
  • Даже если вы решите использовать уникальную уникальную функцию генератора идентификаторов СУБД (UUID и т. Д.), Лучше всего убедиться, что поле HAS должно быть UNIQUE , используя индекс
  • цикл статистически не выполняется вообще, он вводится только при неудаче вставки

Я использую UUID () для создания уникального значения.

пример:

 insert into Companies (CompanyID, CompanyName) Values(UUID(), "TestUUID"); 

Вам может понравиться, как мы это делаем. Мне нужен обратимый уникальный код, который выглядел «случайным» – довольно распространенная проблема.

  • Мы принимаем входное число, такое как 1942.
  • Левая панель в строку: «0000001942»
  • Поместите последние две цифры на передний план: «4200000019»
  • Преобразуйте это в число: 4 200 000 019

Теперь у нас есть число, которое дико меняется между звонками и, как гарантируется, составляет менее 10 000 000 000. Неплохое начало.

  • Преобразуйте это число в строку Base 34: «2oevc0b»
  • Замените все нули «y» и любыми «z»: «2oevcyb»
  • Переключение: «2OEVCYB»

Причина выбора основания 34 заключается в том, что мы не беспокоимся о столкновениях 0 / O и 1 / l. Теперь у вас есть короткий случайный ключ, который вы можете использовать для поиска идентификатора базы данных LONG.

Как вы генерируете уникальные_иды, это полезный вопрос, но вы, кажется, делаете встречное производственное предположение о том, когда вы их генерируете!

Я хочу сказать, что вам не нужно создавать эти уникальные идентификаторы во время создания ваших строк, поскольку они по существу не зависят от вставленных данных.

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

Например, у меня есть таблица заказов с order_id. Этот идентификатор генерируется «на лету», когда пользователь вводит порядок, постепенно 1,2,3 и т. Д. Навсегда. Пользователю не нужно видеть этот внутренний идентификатор.

Затем у меня есть другая таблица – unique_ids с (order_id, unique_id). У меня есть обычная программа, которая запускается каждую ночь, которая предварительно загружает эту таблицу с достаточным количеством строк unique_id, чтобы покрыть заказы, которые могут быть вставлены в следующие 24 часа. (Если я когда-либо получаю 10000 заказов за один день, у меня будет проблема – но это будет хорошая проблема!)

Такой подход гарантирует уникальность и отвлекает любую обработку от транзакции вставки и в пакетную процедуру, где она не влияет на пользователя.

Используйте функцию UUID .

Я не знаю источник ваших процедур в PHP, который генерирует уникальные значения. Если это функция библиотеки, они должны гарантировать, что ваше значение действительно уникально. Проверьте документацию. Вы должны, hovwer, использовать эту функцию все время. Если вы, например, используете функцию PHP для генерации уникального значения, а затем вы решаете использовать функцию MySQL, вы можете генерировать значение, которое уже существует. В этом случае установка УНИКАЛЬНОГО ИНДЕКСА в столбце также является хорошей идеей.

Если вы используете MySQL с версией выше 5.7.4, вы можете использовать недавно добавленную функцию RANDOM_BYTES :

  SELECT TO_BASE64(RANDOM_BYTES(16)); 

Это приведет к случайной строке, такой как GgwEvafNLWQ3+ockEST00A== .

Для уникальности, что я делаю, я беру временную метку Unix и добавляю к ней случайную строку и использую ее.

Ниже приведена только ссылка на числовой уникальный случайный идентификатор …

это может помочь вам …

 $query=mysql_query("select * from collectors_repair"); $row=mysql_num_rows($query); $ind=0; if($row>0) { while($rowids=mysql_fetch_array($query)) { $already_exists[$ind]=$rowids['collector_repair_reportid']; } } else { $already_exists[0]="nothing"; } $break='false'; while($break=='false'){ $rand=mt_rand(10000,999999); if(array_search($rand,$alredy_exists)===false){ $break='stop'; }else{ } } echo "random number is : ".$echo; в $query=mysql_query("select * from collectors_repair"); $row=mysql_num_rows($query); $ind=0; if($row>0) { while($rowids=mysql_fetch_array($query)) { $already_exists[$ind]=$rowids['collector_repair_reportid']; } } else { $already_exists[0]="nothing"; } $break='false'; while($break=='false'){ $rand=mt_rand(10000,999999); if(array_search($rand,$alredy_exists)===false){ $break='stop'; }else{ } } echo "random number is : ".$echo; * $query=mysql_query("select * from collectors_repair"); $row=mysql_num_rows($query); $ind=0; if($row>0) { while($rowids=mysql_fetch_array($query)) { $already_exists[$ind]=$rowids['collector_repair_reportid']; } } else { $already_exists[0]="nothing"; } $break='false'; while($break=='false'){ $rand=mt_rand(10000,999999); if(array_search($rand,$alredy_exists)===false){ $break='stop'; }else{ } } echo "random number is : ".$echo; * $query=mysql_query("select * from collectors_repair"); $row=mysql_num_rows($query); $ind=0; if($row>0) { while($rowids=mysql_fetch_array($query)) { $already_exists[$ind]=$rowids['collector_repair_reportid']; } } else { $already_exists[0]="nothing"; } $break='false'; while($break=='false'){ $rand=mt_rand(10000,999999); if(array_search($rand,$alredy_exists)===false){ $break='stop'; }else{ } } echo "random number is : ".$echo; в $query=mysql_query("select * from collectors_repair"); $row=mysql_num_rows($query); $ind=0; if($row>0) { while($rowids=mysql_fetch_array($query)) { $already_exists[$ind]=$rowids['collector_repair_reportid']; } } else { $already_exists[0]="nothing"; } $break='false'; while($break=='false'){ $rand=mt_rand(10000,999999); if(array_search($rand,$alredy_exists)===false){ $break='stop'; }else{ } } echo "random number is : ".$echo; 

и вы можете добавить char с кодом типа -> $rand=mt_rand(10000,999999) .$randomchar; // assume $radomchar contains char; $rand=mt_rand(10000,999999) .$randomchar; // assume $radomchar contains char;

Вы также можете использовать crypt() * для генерации [почти гарантированного] уникального идентификатора внутри ваших противопоказаний.

  <?php $hostname_conn = "localhost"; $database_conn = "user_id"; $username_conn = "root"; $password_conn = ""; $conn = mysql_pconnect($hostname_conn, $username_conn, $password_conn) or trigger_error(mysql_error(),E_USER_ERROR); mysql_select_db($database_conn,$conn); // run an endless loop while(1) { $randomNumber = rand(1, 999999);// generate unique random number $query = "SELECT * FROM tbl_rand WHERE the_number='".mysql_real_escape_string ($randomNumber)."'"; // check if it exists in database $res =mysql_query($query,$conn); $rowCount = mysql_num_rows($res); // if not found in the db (it is unique), then insert the unique number into data_base and break out of the loop if($rowCount < 1) { $con = mysql_connect ("localhost","root"); mysql_select_db("user_id", $con); $sql = "insert into tbl_rand(the_number) values('".$randomNumber."')"; mysql_query ($sql,$con); mysql_close ($con); break; } } echo "inserted unique number into Data_base. use it as ID"; ?> 

crypt() как было предложено, и сохранить соль в каком-либо файле конфигурации. Начните соль с 1, и если вы найдете дубликат перехода к следующему значению 2. Вы можете использовать 2 символа, но это даст вам достаточно комбинации для соли.

Вы можете сгенерировать строку из openssl_random_pseudo_bytes(8) . Поэтому при запуске crypt() это должно давать случайную и короткую строку (11 символов crypt() .

Удалите соль из результата, и будет только 11 символов, которые должны быть достаточно случайными для 100+ миллионов, если вы измените соль при каждом сбое случайного.