我有两个函数,makeKey()和keyExists()。
makeKey()只生成一个5位随机字母数字键,keyExists()接受此键作为其唯一参数,并在表中查找,返回true / false,具体取决于它是否存在。
我需要做一些非常简单的事情,但我无法找出最快捷的方法。
我只需要创建一个密钥,如果它存在于表中,则再次创建密钥,依此类推,直到返回一个唯一的密钥。我认为while循环就足够了吗?
谢谢,请原谅相当基本的问题,我想我昨天在阳光下煮了我的大脑。
答案 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()算法。对数据库的调用非常昂贵,您可以使脚本编写的调用越少,效率越高。