创建一个独特的密钥 - 最有效的方式

时间:2009-06-01 14:01:50

标签: php while-loop

我有两个函数,makeKey()和keyExists()。

makeKey()只生成一个5位随机字母数字键,keyExists()接受此键作为其唯一参数,并在表中查找,返回true / false,具体取决于它是否存在。

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

我只需要创建一个密钥,如果它存在于表中,则再次创建密钥,依此类推,直到返回一个唯一的密钥。我认为while循环就足够了吗?

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

9 个答案:

答案 0 :(得分:5)

我使用do - while循环:

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

这将在每次迭代时生成一个新密钥,直到该密钥尚不存在。

答案 1 :(得分: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

答案 2 :(得分:2)

我的php有点生疏,所以请考虑这个伪代码:

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

答案 3 :(得分:1)

为什么不使用内置的php函数,如uniqid()

答案 4 :(得分:0)

你提到了一个表,所以我想知道你是否将这些密钥存储在数据库中?如果是这样,您的方法将会出现竞争条件 - 您可能会在另一个进程使用该密钥之前检查密钥是否正常使用。

更好的方法是生成一个可能的密钥,然后尝试保留它 - 可能是通过在密钥表上执行INSERT并使用不同的密钥重试,直到成功为止。

答案 5 :(得分:0)

如果你没有修复5位数字,你可以考虑使用你的id +名称列的哈希值。

答案 6 :(得分:0)

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

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

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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

可能是执行检查的最快方式,如果存在密钥,它将生成一个新密钥。如果在获得新的唯一键之前开始有很多冲突/需要多次检查数据库,您可能需要重新考虑makeKey()算法。对数据库的调用非常昂贵,您可以使脚本编写的调用越少,效率越高。