我有没有任何数据库的静态HTML / JS页面(我不需要它)。但是,我开始与一些问题作斗争。我需要生成必须唯一的随机ID(使用一次,永远不会再次使用)。
Stardard MySQL方式:
在标准应用程序上,我将把所有使用过的ID存储在数据库中 当需要新的时候我会简单地
// I generate ID here, let's say it's 123
SELECT COUNT(id) FROM table WHERE id = 123
我的解决方案可能不是最好的解决方案:
我在考虑替代可能是存储在文件中的一些
// Let's generate ID here, and make it 123 again
$handle = fopen("listOfIDs.txt", "r");
if ($handle) {
$used = false;
while (($line = fgets($handle)) !== false) {
if($line = 123) {
$used = true;
break;
}
}
fclose($handle);
return $used;
} else {
// error opening the file.
}
尽管我可以想象我的选项可能有效,但当文件变大时它可能会超级慢。
问题:
在不使用数据库的情况下保留简单唯一ID的最佳方法是什么。
编辑: 我忘了提到唯一的ID必须是数字。
答案 0 :(得分:1)
你可以使用uniqid(),str_rand(something),timestamp,一些哈希和随机数据你可能永远不会得到两次。
或者,按照自己的方式,您可以在此文件中包含一行信息,只是最后一次使用的ID:
$fp = fopen("lastID.txt", "r+");
if (flock($fp, LOCK_EX)) { // lock the file
$lastId = fgets($fp); // get last id
$newId = $lastId +1; //update the id
ftruncate($fp, 0); // truncate file
fwrite($fp, $newId); //write the new Id
fflush($fp); // flush output
flock($fp, LOCK_UN); // release the lock
} else {
throw new Exception("Could not get the lock");
}
fclose($fp);
return $newId;
答案 1 :(得分:0)
也许您可以使用当前时间戳,请求IP和随机数的混合:
$unique = microtime().$_SERVER['REMOTE_HOST'].rand(0,9999);
理论上你可以得到一个请求,它在相同的微缩时间内使用相同的远程主机执行此操作,并匹配随机数,但我认为这几乎是不可能的。
答案 2 :(得分:0)
您可以使用PHP uniqid并将$ more_entropy设置为true,增加,这会增加结果唯一的可能性。
$id = uniqid("", true);
您还可以使用当前日期和时间等来处理一些随机数。您应该考虑用户生成这些数字的速度有多快,如果它超快,可能会有两个不同的用户生成相同的$ id,因为它同时发生。