Intereting Posts

PHP. Является ли uniqid («») хорошим практическим решением для создания уникальной и последовательной стороны сервера?

Все,

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

В какой степени я могу использовать uniqid("") для этого? Я не строю Google, и я предполагаю, что риск 2 пользователей, регистрирующихся на той же микросекунде, близок к nill, но у меня нет практического опыта в том, чтобы основываться на себе. SQL будет отклонять повторяющиеся идентификаторы, и я могу иметь цикл в моем php-коде, который будет продолжать отправлять новые записи регистрации в случае сбоев при столкновении / вводе данных, но это только хороший подход, если столкновения редки.

В качестве альтернативы, я мог бы добавить случайный postcript с uniqid("",TRUE) , но затем, если 2 пользователя регистрируются в течение той же микросекунды, ключи больше не могут быть последовательными.

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

Благодаря,

JDelage

uniqid – это не что иное, как интерфейс к microtime (поэтому он генерирует последовательные идентификаторы), и как таковой он может быть предсказуемым и может создать дубликат.

Этот идентификатор должен быть последовательным, чтобы обеспечить кластеризованное индексирование. Очевидно, что он также должен быть уникальным. […] Могу ли я это высказать?

Большинство баз данных, включая MySQL, включают в себя генераторы последовательности транзакций. Реализация MySQL, AUTO_INCREMENT , довольно примитивна, но также эффективна. Первичный ключ auto-inc гарантирует уникальность и, что более важно, не странно .

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

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

Я не слышал uniqid сгенерированных же хэшей на последовательных запросах. Потому что его семя – микросекунды, и, скорее всего, ваш процессор выполняет более или менее процессорную инструкцию в микросекундах, слишком много времени между обработкой двух запросов (даже они работают одновременно в одном процессоре).

Если вы считаете, что у вас могут быть столкновения в 512-битном хеше (32 шестнадцатеричных символа), вы можете создать свою собственную функцию дайджеста, которая использует больше символов из алфавита и пунктуации, потому что, как я уже говорил, мы решили проблему семенного времени, все, о чем вы должны беспокоиться, должно состоять в том, чтобы полностью использовать семена и снизить вероятность столкновения.

Если вы хотите быть уверенным, вы можете выполнять запросы взаимоисключающим образом, а затем после подачи запроса на запрос вы можете вставить строку в базу данных (скажем, пользовательскую регистрацию, вы вставляете запись пользователя в таблицу пользователей) и используйте функцию PHP mysql_insert_id() затем вы можете перейти к обслуживанию другого запроса, чтобы вы могли использовать недавно вставленный идентификатор записи в качестве семени (который будет всегда отличаться для любых двух последовательных запросов).

Уточнение последнего абзаца по запросу: как я уже говорил, в то же время в базах данных ничего не происходит, согласно теории обслуживания. Всегда, один из них служил первым. Поэтому вы можете начать транзакцию в базе данных. Допустим, вы регистрируете нового пользователя. Вы скажете INSERT INTO users (username, password) VALUES (?, ?) . Там вы идете, вы вставили нового пользователя. Хотя этот запрос базы данных происходит, вы должны реализовать блокировку взаимного исключения ( mutex ), я не знаю, как это делается в PHP. Если вы реализуете мьютекс, второй запрос будет ждать, пока вы закончите обработку с первым запросом. После того, как строка вставлена ​​в базу данных, вы используете $i = mysql_insert_id() для получения идентификатора только что вставленной строки! Когда вы скажете $i+1 для идентификатора второго пользователя, он будет уникальным. Поскольку первый пользователь допустим 300 , тогда второй пользователь будет 301 .

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

  1. Вставить пользователя. (запрос указан выше)
  2. Получить идентификатор пользователя с помощью $i = mysql_insert_id()
  3. Затем зашифруйте этот идентификатор с помощью некоторого алгоритма дайджеста, такого как $d = strrev(md5($i))
  4. Затем поместите это значение в столбец unique_id таблицы users с UPDATE user SET unique_id='$d' where id=$i query.
  5. Там вы идете, у вас есть уникальная строка для всех.

Я не согласен с UUID. Это не прирост числа и всегда должен быть unqiue. Однако не используйте функцию UUID в инструкции INSERT. Это может привести к проблемам.