2012-02-27 79 views
0

我已经做了串产生:如何使随机字符串生成器筛选出重复的字符串?

<?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(); 
?> 

我的问题是,我认为这是一个机会,这可能会重复的值,它非常重要,这并不发生,因为我将产生其中约70万元。

有没有一种确保生成的字符串不重复的好方法?

谢谢:)

+4

为什么要去所有这些麻烦?只需使用sha1()或md5()。同样,您不会在循环的每次迭代中重新生成PRNG。你一次种下它,并且php在第一次调用rand()时自动为你做。实际上,如果您正在测试并且每次都需要相同的“随机”流,则只能手动进行种子处理。 – 2012-02-27 14:47:29

回答

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交换。

0

有几个选项:

  1. 产生700000个唯一的字符串和随机他们。
  2. 使用GUIDs

虽然你的代码表明,他们作为密码;如果他们确实是这样,那么不要担心重复,因为没有明显的候选可能性更大(例如passwordqwerty123)。

0

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

+1

这里有些挑剔:SHA1和MD5的设计不是无冲突的,但碰撞概率非常低(这意味着它们在实践中应该是无碰撞的)。 – chiborg 2012-02-27 14:58:35

+1

@chiborg:据了解,并且很受欢迎,但是基于OP的帖子,任何有[1%]碰撞几率的东西都会比使用rand()和固定字符串有一个__vast__改进。 – 2012-02-27 15:18:06