Все,
Я хочу создать серверную часть идентификатора пользователя во время регистрации. Этот идентификатор должен быть последовательным, чтобы обеспечить кластеризованное индексирование. Очевидно, что он также должен быть уникальным.
В какой степени я могу использовать 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
.
Фактически, идентификаторы автоматического прироста базы данных всегда уникальны. Если вы хотите иметь уникальный хэш-код для пользователя, вот вам метод.
$i = mysql_insert_id()
$d = strrev(md5($i))
unique_id
таблицы users
с UPDATE user SET unique_id='$d' where id=$i
query. Я не согласен с UUID. Это не прирост числа и всегда должен быть unqiue. Однако не используйте функцию UUID в инструкции INSERT. Это может привести к проблемам.