我不是在寻找生成随机AN字符串的代码,而是更好的方法。
现在我正在使用uniqid()
函数生成随机唯一字符串,即使是百万分之一也应该是唯一的。
是的我不能让它绝对独一无二,除非我每次检查生成数据库并记录生成新数据库时都不可能。但想象一下是否记录了十亿个字符串,并按顺序排列检查它将花费大量时间在每一行中移动的唯一性。
有没有更好的方法可以生成随机引用字符串,这绝对是唯一的?通过数据库检查唯一性的方式是更好的方法吗?
请提出一些解决方案
答案 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()。