2011-06-28 35 views
1

这个函数总是会产生一个唯一的字符串吗?以下函数生成的字符串的长度范围是多少?可以改进以产生更多独特性吗?PHP:这个函数会不会生成一个唯一的字符串?

base_convert(mt_rand(10, 99) . intval(microtime(true) * 100), 8, 36); 

感谢

+4

'uniqid()'怎么办? – KingCrunch

+0

你应该TIAS –

+0

@KingCrunch我想要一个特定的长度,即。最多6个字符。 – sunjie

回答

4

请记住,它通常是一个坏主意,写自己的随机/独特的功能。像KingCrunch提到的PHP有一个内置函数uniqid,它正是你想要的。

要回答你的问题:

功能不会总是产生一个唯一的字符串,它是不可能这样做的。然而,良好的功能使其极不可能(比赢彩票小的倍数),因此在实践中足够独特。

长度:

  • mt_rand(10,99):在的范围内产生多个 [10,99](2位)
  • INTVAL(microtime中(真)* 100)将得到 当前的unix时间戳加上2毫秒的数字。时间戳(目前)10位长(也仍然如此约一个世纪)这样的数字的总数为12(十进制)个数字

然后它将该号码作为base_8数此会经常失败,因为base_8不知道数字8或9。我不知道在这种情况下确切的PHP行为,但它仍然无效。如果您将数字视为基数10,则您有以下情形问题:需要多少数字(基数36)才能表示10^13(如果mt_rand生成10)和10^14(如果mt_rand生成99 )。

base_36需要9位数字的最小数字是2,821,109,907,457,它低于您的号码的下行。 9位数字代表的最大数字是101,559,956,668,416(〜10^14)。因此它会生成一个9位数的base_36号码。

我看到你特别需要一个6字符的独特字符串。请记住,6个字符相对较短,因此唯一性很难保证。你最好的选择仍然是

substr(uniqid(), 0, 6); 

它会比你设法拿出你自己的任何功能更好。[/编辑]

+0

感谢您的详细回复。它应该是从10开始,而不是8次。我想要生成一个字符串,最多6个字母数字字符串,并且具有最大的唯一性。你能建议任何解决方案吗? – sunjie

+1

这是一个非常糟糕的建议,使用uniqid()。基本上uniqid()将microtime()转换为较小的字符串(简单的基本转换)。因此,例如,它的前5个字符在一个小时内不会改变,所以substr(uniqid(),0,6)会在很长一段时间内生成相同的字符串(它肯定不会是唯一的)。其次,即使使用完整的uniqid()字符串,也会使您容易受到某些攻击,因为它的值非常可预测:http://en.wikipedia.org/wiki/Random_number_generator_attack。但是如果你不关心安全性 - 你可以使用substr(uniqid(), - 6)。 – XzKto

0

的回答你的问题取决于你的需求。我使用这个函数来获得通用的不太安全的要求。只返回字母和数字,清除“相似看”字符: -

function fGetRandomString($vLength = 4) { 
    $sRandomString = ""; $sChr = ""; 
    for ($i = 0 ; $i < $vLength ; $i++) { 
     $vState = rand(1, 3); 
      switch ($vState) { 
      case 1: $sChr = chr(rand(65, 90)); break; // CAPS (A-Z) 
      case 2: $sChr = chr(rand(97, 122)); break; // small (a-z) 
      case 3: $sChr = chr(rand(48, 57)); break; // Numbers (0-9) 
     } 
     if (!in_array($sChr, array('O', 'o', '0', '1', 'l'))) $sRandomString .= $sChr; 
     else $i--; 
    } 
    return $sRandomString; 
} 

祝你好运!

1

简单使用uniqid()良好的内置函数。这也从时间戳生成唯一的ID。所以号码永远是独一无二的。

相关问题