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

唯一id的最佳方式(PHP+Mysql),php,mysql,random,unique-key,Php,Mysql,Random,Unique Key,我有一个文件共享网站,每个文件都有一个随机id。例如id:G4t68MgW7 每次上传我都会创建一个随机id,并检查它是否存在于循环中。这样做有一些问题 我必须检查这个id是否存在 这是一个有限的范围 那么,我怎样才能不受限制地创建一个唯一的id,而不检查它是否已经存在呢 注意:我不使用自动增量,因为我想避免机器人访问我网站中的每个文件。它在浏览器中的外观示例:http://www.example.com/file/G4t68MgW7您可以指定时间戳值,即时间作为id。它将始终是唯一的嗯,您或多

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

每次上传我都会创建一个随机id,并检查它是否存在于循环中。这样做有一些问题

我必须检查这个id是否存在 这是一个有限的范围 那么,我怎样才能不受限制地创建一个唯一的id,而不检查它是否已经存在呢


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

您可以指定时间戳值,即时间作为id。它将始终是唯一的

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

用以下伪代码说明:

while (true) {
    hash = generate_hash();

    SQL -> Check if hash found

    if (!found) {
        break;
    }
}
这很容易实现。generate哈希可以是一个简单的md5,也可以是一个基于字母数组构建随机字符串的函数。例如,简单到:

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

在99.999%的情况下,哈希值是唯一的,因此性能不应该成为问题。这也比uniqid产生了更多的随机性。

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

混合使用UNIX时间戳和uniqid,这种混合很难失败。我刚才问了一个类似的问题。答案是一个有用的mysql解决方案。这也可能对您有所帮助:您是否考虑过使用MD5散列文件数据本身?而且很容易找到它,而不是唯一的。两个人同时上传一个文件是一个选项。那么$userid呢?“.time”?那么:return substrmd5time呢。uniqid,0,15?顺便说一句,2y$和ydfdf的用途是什么?为什么是foo和bar?@ArielAharonson:只是为了给组合增加一些随机性。我还预先和结束修复了散列。你的建议也很有用。我只是想在混合中添加一些静态内容,以避免出现最明显的哈希表。仅用于数值的哈希表非常常见。明白了,谢谢。那么,我应该使用静态文字还是像我之前的评论那样使用uniqid?@ArielAharonson-我更喜欢混合文字,就像我发布的那个。只使用其中一个是没有好处的。这在某种程度上取决于安全性的重要性,但无论如何,这需要2秒钟的时间来实现。
echo substr(uniqid(rand(10,1000),false),rand(0,10),6)