MySQL Уникальная вставка хеша - PullRequest
0 голосов
/ 19 марта 2010

Итак, представьте себе таблицу mysql с несколькими простыми столбцами, автоинкрементом и хешем (varchar, UNIQUE).

Можно ли дать mysql запрос, который добавит столбец, и сгенерироватьуникальный хеш без множественных запросов?

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

Вот несколько псевдо-php, которые явно не проверены, но дают общее представление:

while(!query("INSERT INTO table (hash) VALUES (".generate_hash().");")){
    //found conflict, try again.
}

В вышеприведенном примере столбец хеш-функции будет УНИКАЛЬНЫМ, и поэтому запрос не будет выполнен.Проблема в том, что, скажем, в БД 500 000 записей, и я работаю с хеш-генератором base36 с 4 символами.Вероятность конфликта была бы почти 1 к 3, и я определенно не могу выполнить 160 000 запросов.Фактически, больше 5 я бы посчитал неприемлемым.

Итак, могу ли я сделать это с помощью чистого SQL?Мне нужно сгенерировать base62, 6-символьную строку (например: "j8Du7X", chars az, AZ и 0-9) и либо обновить ее last_insert_id, либо, что еще лучше, сгенерировать ее во время вставки.

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

Есть идеи?Я бы предпочел использовать либо чистый MySQL, либо PHP & MySQL, но, черт возьми, если другой язык может сделать это чисто, я бы собрал скрипт и AJAX тоже.

Спасибо!

Ответы [ 6 ]

3 голосов
/ 19 марта 2010

Если ваше сердце настроено на использование 4-х символьных хэшей base-36 (хэш-пространство всего 1679616), вы, вероятно, можете предварительно сгенерировать таблицу хэшей, которой еще нет в другой таблице. Тогда найти уникальный хеш будет так же просто, как переместить его из «неиспользуемой таблицы» в «использованную таблицу», то есть O (1).

Если ваша таблица, вероятно, заполнена на 1/3, вы можете рассмотреть вопрос о расширении своего хэш-пространства, так как оно, вероятно, заполнится в течение вашей жизни. Как только пространство заполнится, вы больше не сможете находить уникальные хэши, независимо от того, какой алгоритм вы используете.

1 голос
/ 19 марта 2010

Как другие предположили, что не так с полем autoinc? Если вам нужно буквенно-цифровое значение, вы можете просто выполнить простое преобразование из int в буквенно-цифровую строку в базе 36. Это может быть реализовано практически на любом языке.

1 голос
/ 19 марта 2010

Что это за хэш? Кажется, вы просто хотите случайно сгенерированный уникальный столбец VARCHAR? Что не так с автоматическим приращением?

В любом случае, вы должны просто использовать больший хеш - найти функцию MD5 - (если вы действительно что-то хешируете) или генератор UUID с более чем 4 символами, и да, вы можете использовать цикл while, но создать достаточно большой, чтобы невероятно маловероятные конфликты

0 голосов
/ 17 июля 2014

Вы также можете проверить функции MySQL UUID () и UUID_SHORT () . Эти функции генерируют UUID, которые по определению являются глобально уникальными. Вам не придется перепроверять, существует ли уже созданная вами PHP-строка хеша.

Я думаю, что в некоторых случаях эти функции также могут соответствовать требованиям вашего проекта. : -)

0 голосов
/ 28 марта 2010

Итак, на случай, если кто-нибудь столкнется с подобной проблемой, я использую поле UNIQUE, я буду использовать хэш-функцию php для вставки хэшей, если она вернется с ошибкой, я попробую еще раз , Надеемся, что из-за низкой вероятности конфликта он не замедлится.

0 голосов
/ 19 марта 2010

Если вы прокомментируете zneaks, почему бы вам не использовать колонку автоинкремента? сохранить хеш в другом (не уникальном) поле и связать с ним идентификатор (динамически). Таким образом, вы даете пользователю [хэш] [идентификатор]. Вы можете разобрать его в чистом SQL, используя функции substring.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...