создание уникального ключа - самый эффективный способ - PullRequest
2 голосов
/ 01 июня 2009

У меня есть две функции, makeKey () и keyExists ().

makeKey () просто генерирует 5-значный случайный буквенно-цифровой ключ, keyExists () принимает этот ключ в качестве единственного аргумента и ищет в таблице, возвращая истину / ложь в зависимости от того, существует ли она.

Мне нужно сделать что-то очень простое, но я не могу найти самый быстрый способ сделать это.

Мне просто нужно сделать ключ, и, если он существует в таблице, сделать ключ снова и так далее, пока не будет возвращен уникальный ключ. Я думаю, что цикл while будет достаточно?

Спасибо и, пожалуйста, простите за довольно простой вопрос, я думаю, что вчера приготовил свой мозг на солнце.

Ответы [ 9 ]

5 голосов
/ 01 июня 2009

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

Псевдо-код

alphabet = "ABCDE...789";
key = insert new row, get autogenerated key
alphaKey = "";
while (get n bits from key)
   alphaKey += alphabet[bits]
done
echo alphaKey
5 голосов
/ 01 июня 2009

Я бы использовал do - while цикл:

do {
    $newKey = makeKey();
} while (keyExists($newKey));

Это будет генерировать новый ключ на каждой итерации, пока ключ еще не существует.

2 голосов
/ 01 июня 2009

мой php немного ржавый, поэтому рассмотрим этот псевдокод:

$key_exists = true;
while($key_exists) {
       $key = generateKey();
       $key_exists = checkKey($myKeysHash, $key);
}
// $key is now unique and ready to use
1 голос
/ 01 июня 2009

Почему бы не использовать встроенную функцию php, такую ​​как uniqid () ?

0 голосов
/ 01 июня 2009

while (keyExists($newKey = makeKey()));

Вероятно, самый быстрый способ сделать проверку, если ключ существует, он сгенерирует новый. Если вы начинаете сталкиваться с множеством коллизий / проверять базу данных много раз, прежде чем получить новый уникальный ключ, вы, вероятно, захотите переосмыслить свой алгоритм makeKey (). Вызовы в БД дороги, чем меньше звонков вы сможете сделать, тем быстрее и эффективнее будет ваш скрипт.

0 голосов
/ 01 июня 2009

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

0 голосов
/ 01 июня 2009

Я также предполагаю, что вы используете какую-то базу данных.

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

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

0 голосов
/ 01 июня 2009

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

0 голосов
/ 01 июня 2009

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

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

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