我正在尝试使用此代码生成唯一ID:
$ RCode = md5(uniqid(rand(),true));
然后我希望它在我的数据库中检查RCode是否是唯一的。
如果我不希望它再次使用该部分代码并再次检入我的数据库,如果它是唯一的,
如果它是唯一的,它应该写入我的数据库。
我拥有检查和写入数据库所需的所有代码,我只是不知道如何让它循环回到开始。
非常感谢帮助!
提前多多感谢!
答案 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 uniqueid
。 uniqueid
足够好,如果单独使用它就没有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());