代码之家  ›  专栏  ›  技术社区  ›  Grufas

PHP检查数据库表,如果存在值,则运行循环生成唯一值

  •  1
  • Grufas  · 技术社区  · 6 年前

    我有一个检查值是否存在的函数,在本例中它是API键。我试图实现的是,在为每个帐户注册创建新的api密钥之前,如果数据库中已经存在新的密钥,我希望循环我的函数来生成新的密钥。键是使用以下命令生成的简单字符串:

    $apiKey = bin2hex(random_bytes(16));
    

    function apiCheckKey($apiKey) {
        global $conn;
        $sql = "SELECT * FROM `api` WHERE `key` = '".$apiKey."'";
        $result = mysqli_query($conn, $sql);
    
        if (mysqli_num_rows($result)) {
            return true;
        } else {
            return false;
        }
    }
    

    我的支票:

    if(!apiCheckKey($apiKey)) {
         // loop
    }
    

    如何有效地运行循环以生成新密钥并消除重复项?请记住,数据库将包含100000+条记录。。。

    1 回复  |  直到 6 年前
        1
  •  1
  •   tadman    6 年前

    在进行此操作时,需要记住以下几点:

    1. 确保你有一个 UNIQUE 约束,因此不可能添加重复的值。你不能依赖一个 SELECT COUNT(*) FROM x WHERE key=? 在插入之前进行测试,因为它容易受到 race conditions .
    2. 生成一个足够随机的API密钥,以避免冲突。一个>=20个字符的随机字符串,使用所有字母,包括大写和小写,加上数字将有70442342554699802296830264616370176种可能的形式,因此碰撞在天文上是不可能的。如果关键帧较短,由于以下效果,碰撞的可能性会大得多 the pigeonhole principle birthday paradox .
    3. 独一无二的 error INSERT 失败并相应调度。

    通过生成几百万个密钥来测试代码,以确保其正常运行。