<php>如何生成一个没有自动增量的唯一字段</php>

时间:2011-07-06 17:31:34

标签: php

我正在尝试使用此代码生成唯一ID:

$ RCode = md5(uniqid(rand(),true));

然后我希望它在我的数据库中检查RCode是否是唯一的。

如果我不希望它再次使用该部分代码并再次检入我的数据库,如果它是唯一的,

如果它是唯一的,它应该写入我的数据库。

我拥有检查和写入数据库所需的所有代码,我只是不知道如何让它循环回到开始。

非常感谢帮助!

提前多多感谢!

9 个答案:

答案 0 :(得分:1)

一开始不要打扰。而是在列上放置一个唯一约束,这样如果RCode不是唯一的,插入将失败。然后你可以处理该错误/异常并尝试另一个哈希。碰撞的可能性很低,因此在这种情况下,您可能不会破坏数据库。

答案 1 :(得分:0)

$found = false;
while (! $found) {
  //try..
  if (...unique...) {
    $found = true;
  }
}

答案 2 :(得分:0)

开始就像实现while循环一样简单。哎呀,你甚至可以使用 goto (开玩笑!)。

但我不明白为什么你不想使用auto_increment。

答案 3 :(得分:0)

您可以使用“永远循环然后成功突破”方法:

while (true) {
    $RCode = ...;
    if ($RCode does not exist in db) {
        break;
    }
}
write to the db

编辑:或者更好,确保该字段对其有唯一约束,然后通过检查插入失败来测试唯一性:

while (true) {
    $RCode = ...
    try to insert RCode
    if (no failure) {
        break;
    }
}

这对并发命中更具弹性。

答案 4 :(得分:0)

do-while循环的典型示例。

一些PHP伪代码:

do {
    $rcode = md5(uniqid(rand(), true));
    $res = mysql_result(mysql_query("SELECT COUNT(*) FROM records WHERE rcode='$rcode'"));
} while ($res[0] > 0);

mysql_query("INSERT INTO records (rcode) VALUES ('$rcode')");

答案 5 :(得分:0)

当您使用uniqid()散列md5()返回值时(对于任何其他散列算法都是如此),获取唯一字符串的可能性非常低。

在我看来,它非常低,以至于检查该字符串是唯一的也是过度的。

您需要做的就是在数据库中插入值。它将是独一无二的!

修改

你应该使用uniqid(null, true)获得23个字符长的唯一字符串。如果那就是你需要的 - 独特的字符串。

答案 6 :(得分:0)

首先,不要md5 uniqueiduniqueid足够好,如果单独使用它就没有md5的开销。

其次,与使用UUID或某些等效项相比,自动递增数字obscuring要好得多。

但是,如果你必须:

do {
    $rcode = uniqid(rand(), true);
    $res = mysql_query("SELECT COUNT(*) FROM records WHERE rcode='$rcode'");
} while ($res && mysql_num_rows($res));

mysql_query("INSERT INTO records (rcode) VALUES ('$rcode')");

// OR!
// assuming unique index on rcode
do {
    $rcode = uniqid(rand(), true);
} while (mysql_query("INSERT INTO records (rcode) VALUES ('$rcode')"););

答案 7 :(得分:0)

这个答案与您提出的问题略有不同,但它以不同的方式解决了唯一ID的问题,根据您的应用程序可能会更好地使用。

老实说,我喜欢使用日期和时间等变量以及其他变量(例如IP地址)这类事物,您可以非常肯定您的ID将是唯一的,因为日期和时间不会如果在同一秒内有2个请求,则用户的IP地址此时也是完全唯一的。另外,不必检查数据库。一个例子是

$idstring = date('Ymdhis');
$ipstring = $_SERVER['REMOTE_HOST'];
$hashme = $idstring.$ipstring;
$idhash = md5($hashme);

我希望这会有所帮助。

答案 8 :(得分:0)

你可以在时间戳上运行MD5 ......

$uniqueid = md5(time());