寻求帮助创建唯一ID并确保它不存在于DB中

时间:2012-01-08 13:12:02

标签: php mysql function compare

我正在尝试创建一个函数,在运行时创建数字ID,检查数据库中是否存在该ID,如果存在,则创建另一个ID并再次检查,直到它具有唯一ID。我坚持如何使用函数循环函数

function createUniqueID() {

function buildUnique() {
    $uniqueID = rand(100000000000,999999999999);
    return $uniqueID;
}

function compareWithDB($uniqueID) {
    $s = "SELECT id FROM table WHERE id='{$uniqueID}'";
    $r = mysql_query($s);
    return $r;
}

function countDBRows($r) {
    if(mysql_num_rows($r) >0){
        $f = false; // found   
    } else{
        $f = true;
    }
}

$uniqueID = buildUnique();
$r = compareWithDB($uniqueID);
$f = countDBRows($r);

if (!$f) {
    $uniqueID = 'nope';
}

return $uniqueID;

}

5 个答案:

答案 0 :(得分:4)

你最好调用MySQL的UUID()功能,存储&返回它的值,除非该值绝对必须是数字。

SELECT UUID();

答案 1 :(得分:2)

如果您想要一个唯一的号码,请使用AUTO_INCREMENT

如果您想要一个唯一的随机号码(为什么?),请在ID列上创建一个唯一索引并继续尝试,直到您收到 no 错误。这对于并发更好:多个并发调用可以具有相同的数字并通过测试。更好的是,让数据库引擎使用RAND ...

答案 2 :(得分:1)

我可能会建议更简单,更有效的uniqid功能,它将为您完成此操作。它根据时间戳(以毫秒为单位)生成有保证的唯一ID。生成的Id长度为13位,除非您决定添加前缀或使用额外的“熵”(更多唯一性)。

编辑:请注意,这是函数返回的数字和字母。

http://php.net/manual/en/function.uniqid.php

编辑2 : 在这里使用你的方法是如何嵌套循环......

while (true) {
    $uniqueID = buildUnique();
    $r = compareWithDB($uniqueID)
    if (countDBRows($r)) { break; }
}

然后您的唯一ID存储在$ uniqueID中。然而,我确实劝阻这个,因为它笨重而低效......但是你去了! :)

答案 3 :(得分:1)

另一种方式, 您可以将sha1()函数与静态变量结合使用,如下所示:

function GetUniqueID() {
    static $salt=1;
    $id = sha1("somestring".(string)$salt);
    $salt++;
    return $id;
}

这里$ salt是静态的,它在所有调用之间保留其值,以确保唯一ID(SHA1的散列)。为了更安全,“somestring”也可以随机化。

答案 4 :(得分:1)

我正在回答我自己的问题,因为我找到了一个解决方案,即创建一个很可能永远不会复制的大数字。我使用三个随机的2位数变量和三种不同的日期语法。

将它们放在一起就可以清楚地知道它们永远不会复制,除非有人碰巧在同一年,一周内发布并且在一分钟内具有相同的秒数,并且还有3个不同的随机数都是相同的。

我认为发生这种情况的可能性将达到数百万,如果有数百万的帖子发生,那么我相信我会有更多的资源来解决这个问题。

$rand1 = rand(10,99);
$rand2 = rand(10,99);
$rand3 = rand(10,99);
$date1 = date("s"); // seconds
$date2 = date("y"); // 2 digit year
$date3 = date("W"); // week number (out of 52)
$uniqueID = $date1.$rand1.$date2.$rand2.$date3.$rand3;
return $uniqueID;