2009-06-01 2 views
2

У меня есть две функции: makeKey() и keyExists().Создание уникального ключа - самый эффективный способ

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

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

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

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

+0

Это займет некоторое время после того, как у вас есть 99999 строк. –

ответ

5

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

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

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

2

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

$key_exists = true; 
while($key_exists) { 
     $key = generateKey(); 
     $key_exists = checkKey($myKeysHash, $key); 
} 
// $key is now unique and ready to use 
0

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

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

5

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

Псевдо-код

alphabet = "ABCDE...789"; 
key = insert new row, get autogenerated key 
alphaKey = ""; 
while (get n bits from key) 
    alphaKey += alphabet[bits] 
done 
echo alphaKey 
0

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

1

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

0

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

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

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

0

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

0

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

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

Смежные вопросы