2009-06-01 30 views
2

我有两个函数,makeKey()和keyExists()。 ()只是生成一个5位随机字母数字键,keyExists()接受这个键作为唯一参数,并在表中查找,根据它是否存在返回true/false。创建一个唯一的键 - 最有效的方法

我需要做一些非常简单的事情,但我无法弄清楚最快捷的方法。

我只需要制作一个关键字,如果它存在于表格中,再次制作一个关键字,等等,直到返回一个唯一的关键字。我认为一个while循环就足够了?

谢谢,请原谅基本的问题,我想我昨天在阳光下煮了我的大脑。

+0

在你有99999行之后需要一段时间。 – 2009-06-01 18:18:01

回答

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

任何依赖创建的解决方案,随着关键空间的填补,检查将会有可怕的表现。您最好使用自动生成的列(身份或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位数的号码,你可以考虑使用你的ID的哈希+的名称列。

0

我还假设你正在使用某种数据库。

你不能在数据库中使用唯一的自动增量ID列吗?它将删除检查密钥是否存在的要求,因为数据库引擎永远不会分配两次相同的ID。

但是,您必须更改应用程序中的逻辑,而不是仅编写新功能。

0

是否需要随机?只需增加一个变量并存储下一个要在另一个字段中使用的变量。

0

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

可能做检查,如果密钥存在,它会生成一个新的最快方式。如果您在获取新的唯一密钥之前开始有很多冲突/需要多次检查数据库,那么您可能会想要重新考虑makeKey()算法。调用数据库代价非常高,您可以使脚本更快,更高效的调用次数更少。

相关问题