没有重复的PHP随机字符串生成器

时间:2011-09-20 05:19:47

标签: php string random unique generator

我正在尝试编写一个PHP函数,它将生成“所谓的”随机字符串,无论运行的次数如何,都需要是唯一的。好吧,它可以运行不止一次,但最好不要多次。

例如,当您将图像上传到imgur时,它会生成一个随机的5个字母[a-zA-Z]字符串。如果我想复制它(在MySQL数据库中存储带有唯一KEY的字符串),而不必重复选择并确保密钥不存在是否有任何方法? 同时,随机的重要性确实存在,所以我宁愿不去1,2,3(aaaaa,aaaab,aaaac),因为这会完全消除对随机性的需求。

我知道有52 ^ 5种不同的可能性,但仅用于教育目的(以及未来的算法编写),是否有一种有效的方法来生成这些“独特的”“随机”字符串?

[编辑]据我所知,独特+随机(基本上)是不可能的。但有什么方法可以生成独特的,非显而易见的字符串?谢谢danishgoel!

3 个答案:

答案 0 :(得分:1)

当您随机生成任何数据时,您无法保证唯一性。

您只有生成重复项的概率,具体取决于随机化算法和随机数据的可能性。

通常情况下,这一点非常低。

但是如果你想保证唯一性,你有两种方法:

  1. 搜索以前生成的结果并丢弃重复项(这是您的MySQL方法)
  2. 使用您知道唯一的某个值,并将该值附加/预先附加到随机数据,例如如果是Web应用程序,您可以使用IP Address of requesterrequest time保证生成唯一数据,因为两个用户在同一时间不能拥有相同的IP地址

答案 1 :(得分:0)

这依赖于时间,因此极不可能带来重复。

$randString = date("Ymdhis") . rand(10000, 99999);

虽然有点长。

答案 2 :(得分:-2)

我发现一种简单的方法:

$charset = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$rand_str = '';
$desired_length = 10;
while(strlen($rand_str) < $desired_length)
  $rand_str .= substr(str_shuffle($charset), 0, 1);

......或......

$desired_length = 10;
echo base64_encode(openssl_random_pseudo_bytes($desired_length));

您还应该阅读two more methods to generate random string using php