【问题标题】:How to make random string generator filter out duplicate strings?如何使随机字符串生成器过滤掉重复的字符串?
【发布时间】:2012-02-27 14:42:10
【问题描述】:

我已经做了一个字符串生成器:

    <?php

function createRandomPassword() {
    $chars = "abcdefghijkmnopqrstuvwxyz023456789";
    srand((double)microtime()*1000000);
    $i = 0;
    $pass = '' ;
    while ($i <= 12) {
        $num = rand() % 33;
        $tmp = substr($chars, $num, 1);
        $pass = $pass . $tmp;
        $i++;
    }
    return $pass;
}


// Usage
$product_names = array ();
for ($i=0; $i < 100; $i++ )
$product_names[] = "code-" . createRandomPassword();
?>

我的问题是,我认为这可能会重复值,这非常重要,因为我将生成大约 700,000 个值。

有没有好办法保证生成的字符串不重复?

谢谢:)

【问题讨论】:

  • 为什么要这么麻烦?只需使用 sha1() 或 md5()。同样,您不会在循环的每次迭代中重新播种 PRNG。你播种一次,php 会在你第一次调用 rand() 时自动为你做这件事。实际上,只有在您进行测试并且每次都想要相同的“随机”流时,您才需要手动播种。

标签: php string random generator


【解决方案1】:

以下示例将生成 100 个产品名称,删除重复项并生成新的产品名称,直到产品名称数组的计数为 100。

$cnt = 0;
$product_names = array ();
while($cnt < 100) {
   for ($i=0; $i < 100 - $cnt; $i++ )
     $product_names[] = "code-" . createRandomPassword();
   $product_names = array_unique($product_names);
   $cnt = count($product_names);
}

您可以将数字 100 放入变量或常数中,并与 700,000 交换。

【讨论】:

    【解决方案2】:

    几个选项:

    1. 生成 700000 个唯一字符串并随机播放它们。
    2. 使用GUIDs

    尽管您的代码建议将它们用作密码;如果确实如此,那么不要担心重复,因为没有明显的候选者可能更有可能(例如 passwordqwerty123)。

    【讨论】:

      【解决方案3】:

      创建一个查找/检查表(在数据库或文件中)或制定一个算法来生成更好的唯一键(使用 md5 或 sha 或设计为唯一的东西)。

      【讨论】:

      • 这里有些吹毛求疵:SHA1 和 MD5 并非设计为无碰撞的,但碰撞概率非常非常低(这意味着它们在实践中应该是无碰撞的)。
      • @chiborg:理解并广受好评,但是根据 OP 的帖子,任何 [甚至] 1% 的碰撞几率都比使用 rand 有了巨大的改进() 和一个固定字符串。
      猜你喜欢
      • 1970-01-01
      • 2010-12-07
      • 2015-08-16
      • 2017-04-05
      • 2010-11-10
      • 2011-08-06
      • 2011-11-20
      相关资源
      最近更新 更多