总是在不使用数据库的情况下创建UNIQUE ID - PHP

时间:2016-10-18 19:45:32

标签: php

我有没有任何数据库的静态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必须是数字。

3 个答案:

答案 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,因为它同时发生。