【问题标题】:Best way for unique id (PHP + Mysql)唯一ID的最佳方式(PHP + Mysql)
【发布时间】:2014-07-03 11:27:42
【问题描述】:

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

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

  1. 我必须检查这个 id 是否存在(Mysql 查询)
  2. 范围有限

那么我怎样才能不受限制地创建一个唯一 id,并且不检查它是否已经存在?

注意:我不使用Auto Increment,因为我想避免机器人访问我网站中的每个文件。它在浏览器中的外观示例:http://www.example.com/file/G4t68MgW7

【问题讨论】:

标签: php mysql random unique-key


【解决方案1】:

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

【讨论】:

  • 而且很容易破解
  • 不是唯一的。可以选择两个人同时上传一个文件。
  • $userid.'_'.time() 怎么样??
【解决方案2】:

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

用以下伪代码说明:

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() 更多的“随机性”。

【讨论】:

  • 怎么样:return substr(md5(time() . uniqid()), 0, 15); ?顺便说一句,$2y$ydfdf 是干什么用的?
  • 为什么是foobar
  • @ArielAharonson :只是为了增加一些随机性。我还预先和最终修复了哈希。你的建议也会做。我只是想添加一些静态的东西来避免最明显的哈希表。仅用于数值的哈希表很常见。
  • 知道了,谢谢。那我应该像我之前的评论一样使用静态词还是uniqid()
  • @ArielAharonson - 我更喜欢混合,就像我发布的那样。只使用其中一个是不好的。有点取决于关键安全性的程度,但这无论如何都需要 2 秒才能实现。
【解决方案3】:
echo substr(uniqid(rand(10,1000),false),rand(0,10),6)

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-15
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 2017-08-26
      • 1970-01-01
      • 2012-10-11
      • 1970-01-01
      相关资源
      最近更新 更多