我正在尝试创建一个函数,在运行时创建数字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;
}
答案 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;