如何生成随机唯一字符串列表?

时间:2015-07-09 18:49:16

标签: php

我正在使用此函数创建一个随机字符串,但是如何让它为500个字符串生成唯一的字符串列表?

function generateRandomString($length = 8) {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, strlen($characters) - 1)];
    }
    return $randomString;
}

3 个答案:

答案 0 :(得分:1)

如果您担心表格中插入的行,那么有3种简单的方法可以做到。

首先, 您可以检查数据库中是否存在该字符串,然后创建另一个随机字符串。

第二种方式, 使用mysql的UUID()函数生成随机值,无需担心重复。

第三种方式, 如果你想要数组,生成500个字符串并放入一个数组。然后使用array_unique()删除重复。如果数组长度<1。 500然后生成更多(例如12个字符串)然后检查是否&lt; 500一次又一次,直到达到500.检查可以在一个循环左右完成。

while( count($arr) < 500 )
{
    $arr[] = generateRandomString();

    if( count($arr) == 500 )
        $arr = array_unique( $arr );

}

答案 1 :(得分:0)

@MohamedFadili你需要首先使用generateRandomString();生成你的字符串,然后检查它是否存在于数据库中,在这种情况下你需要继续尝试,直到找到一个不存在的字符串,以避免死循环,你可以X尝试后抛出异常(X = 10可能?)所以代码看起来如下所示:

一个。如果数据库中有唯一约束(插入时会抛出异常)

$attempts = 10;
$i = 0;
$inserted = false;
while (!$inserted || $i < $attempts) {
try {
    $myRandomString = generateRandomString();
    // MySQL CODE TO DO YOUR INSERT HERE IT COULD THROW AN EXCEPTION IF THE STRING ALREADY EXIST IN DATABASE

    // here if insertion operation was successful you set $inserted variable to true
    $inserted = true;
    } catch (PDOException $ex){
    // do nothing
    }
}

湾如果数据库中没有唯一的索引约束,则需要由您自己检查:

$attempts = 10;
$inserted = false;

while (!$inserted || $i < $attempts){
$myRandomString = generateRandomString();

// SQL CODE TO CHECK IF $myRandomString Exist 
// IF NOT EXIST DO INSERT AND SET $inserted to true
$inserted = true;

// ELSE IF EXIST KEEP TRYING

}

答案 2 :(得分:0)

技巧不是生成500个字符串的列表。显然,您可以使用for循环完成此操作:

$random = array();
for ($i = 0; $i < 500; $i++)
    $random[] = generateRandomString();

你想要的是500个唯一的字符串。正如@meh指出的那样,您可以通过使用array_unique不断消除重复项来实现此目的。不过,我不是每次通过时都是这样做的忠实粉丝,因为它导致生成一个新的,独特的阵列至少500次!我更喜欢做的是在将每个值插入数组之前检查它是不是重复。搜索比搜索和删除更快,而搜索和删除又比n²搜索和删除更快。这样的事情,也许是:

$unique = array();
for ($i = 0; $i < 500; $i++)
{
    do
    {
        $random = generateRandomString();
    } while (in_array($random, $unique));
    $unique[] = $random;
}