唯一ID的最佳方式(PHP + Mysql)

时间:2014-07-03 11:27:42

标签: php mysql random unique-key

我有一个文件共享网站,每个文件都有一个随机ID。 id的示例:G4t68MgW7

每次上传我都会创建一个随机ID,并检查它是否存在(在循环中)。这种方式存在一些问题。

  1. 我必须检查这个id是否存在(Mysql查询)
  2. 这是一个有限的范围
  3. 那么如何才能无限制地创建唯一 ID并且不检查它是否已经存在?

    注意:我不使用Auto Increment因为我想避免机器人到达我网站上的每个文件。它在浏览器中的显示方式示例:http://www.example.com/file/G4t68MgW7

4 个答案:

答案 0 :(得分:0)

您可以将时间戳值,即time()指定为id。它总是独一无二的

答案 1 :(得分:0)

嗯,你自己或多或少地给出了答案。

使用以下伪代码进行说明:

while (true) {
    hash = generate_hash();

    SQL -> Check if hash found

    if (!found) {
        break;
    }
}

实现这一点非常容易。生成散列可以是简单的md5,也可以是基于字母数组构建随机字符串的函数。例如,简单的事情:

function generate_hash() {
    return '$2y$' . substr(md5(time() . 'foo' . rand(0, 1000000) . 'bar'), 0, 15) . 'ydfdf';
}

在99.999%的情况下,散列将是唯一的,因此性能不应成为问题。这也创造了更多的随机性"比uniqid()

答案 2 :(得分:0)

echo substr(uniqid(rand(10,1000),false),rand(0,10),6)

答案 3 :(得分:0)

您可以拥有一个预定义标识符的表格,因此您需要确保它们在创建时间内是唯一的(您不必查询它们是否存在;如果插入失败,只需插入并不执行任何操作) 。如果要上载文件,请获取未使用的代码并将其标记为已使用,以便不再使用。 您还可以使用cron来检查代码是否已用完,并再次运行生成脚本(增加字符数会使代码数量几乎无限制)。由于这是异步的,因此不会影响性能。

相关问题