在php中生成一个绝对唯一的字符串

时间:2014-10-06 12:50:25

标签: php random

我不是在寻找生成随机AN字符串的代码,而是更好的方法。

现在我正在使用uniqid()函数生成随机唯一字符串,即使是百万分之一也应该是唯一的。

是的我不能让它绝对独一无二,除非我每次检查生成数据库并记录生成新数据库时都不可能。但想象一下是否记录了十亿个字符串,并按顺序排列检查它将花费大量时间在每一行中移动的唯一性。

有没有更好的方法可以生成随机引用字符串,这绝对是唯一的?通过数据库检查唯一性的方式是更好的方法吗?

请提出一些解决方案

5 个答案:

答案 0 :(得分:1)

很容易生成独特的字符串:" 0001"," 0002"," 0003",..." 9999"都是独一无二的。如果你想要一些既独特的东西,你无法分辨下一个是什么,那就使用某种形式的加密。由于加密是可逆的,因此独特的输入将产生独特的输出。只需加密:" 0001"," 0002"," 0003"等等,使用合适的密码,您将获得一系列独特的字符串,其中的下一个成员除了有钥匙的人之外,这套装置并不明显。

答案 1 :(得分:1)

您可以使用当前时间并对此进行散列,此外还有额外的唯一性(因为这只会每秒更改一次),您可以在散列之前添加一个随机数;如下:

$string = time() . mt_rand(1,10000);
hash("whirlpool",$string);
然而,重复的可能性很小,这个机会非常小。

修改rand()更改为mt_rand(),因为rand()仍然是某种可猜测的。

答案 2 :(得分:0)

你不能只将服务器时间用作一个唯一的字符串吗?如果你有多个字符串同时做一个快速查询,因为在数据库中不应该有那么多的确切时间并且只是增加它...

或者您可以使用具有唯一主行的数据库,以便1,2,3 .....

答案 3 :(得分:0)

如果您使用的是uniqid(),那么您可以继续这样做,但您必须在数据库中执行检查。使用PDO,您可以像这样实现:

$run = 1;
$done = 0;
while (!$done) {
    if ($run) {
        $unique_id = uniqid();
        $statement = $this->db->prepare("SELECT * FROM your_table WHERE unique_id = :unique_id");
    } else {
        $statement = $this->db->prepare("INSERT INTO your_table('unique_id') VALUES (:unique_id)");
        $done = 1;
    }
    $statement->bindValue(":unique_id", $unique_id, PDO::PARAM_STR);
    $statement->execute();
    $run = $statement->rowCount();
}

答案 4 :(得分:0)

Uniquid已经相当独特,并且基于当前时间戳,因此未来的值不会与过去的值匹配。当两个请求以相同的毫秒进入时,它就会出现问题。

这个小函数会生成一个安全且唯一的字符串。它检查该值是否已经存在,但是这个值的可能性非常低,几乎在所有情况下都应该足够了。

function better_uniqid($length = 12){
    $data = openssl_random_pseudo_bytes(ceil($length / 2));
    return bin2hex($data);
}

此函数依赖于openssl扩展和PHP 5.3 +

http://php.net/manual/en/function.openssl-random-pseudo-bytes.php

此函数还避免了可能不安全的方法,如rand()。