PHP:这个函数是否总是生成一个唯一的字符串?

PHP:这个函数是否总是生成一个唯一的字符串?,php,base-conversion,Php,Base Conversion,下面的函数是否总是生成唯一的字符串?以下函数生成的字符串的长度范围是多少?是否可以改进它以生成更多的唯一性 base_convert(mt_rand(10, 99) . intval(microtime(true) * 100), 8, 36); 谢谢请记住,编写自己的随机/唯一函数通常不是一个好主意。就像KingCrunch提到的那样,PHP有一个内置函数,可以精确地执行您想要的操作 回答你的问题: 函数不会总是生成唯一的字符串,这是不可能的。然而,良好的功能使其极不可能比中彩票的次数少,因

下面的函数是否总是生成唯一的字符串?以下函数生成的字符串的长度范围是多少?是否可以改进它以生成更多的唯一性

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

谢谢

请记住,编写自己的随机/唯一函数通常不是一个好主意。就像KingCrunch提到的那样,PHP有一个内置函数,可以精确地执行您想要的操作

回答你的问题:

函数不会总是生成唯一的字符串,这是不可能的。然而,良好的功能使其极不可能比中彩票的次数少,因此在实践中足够独特

长度:

mt_rand10,99:生成一个数字 范围为[10,99]2位 intvalmicrotimetrue*100将获得 当前unix时间戳加上2 毫秒的位数。时间戳目前为10位,并将持续大约一个世纪,因此总数字为12位十进制数字 然后,它将该数字视为基数8,这将经常失败,因为基数8不知道数字8或9。我不知道在这种情况下PHP的确切行为,但它是无效的。如果将数字视为基数10,则会出现以下场景问题:如果mt_rand生成10,那么基数36需要多少位数来表示10^13和10^14之间的数字(如果mt_rand生成99)

base_36需要9位数字的最小数字是282110907457,该数字低于您的数字底边。但是,它可以用9位数字表示的最大数字是101559956668416~10^14。因此,它将生成一个9位数的基数

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


它比您自己设计的任何函数都要好。[/edit]

请记住,编写自己的随机/唯一函数通常不是一个好主意。就像KingCrunch提到的那样,PHP有一个内置函数,可以精确地执行您想要的操作

回答你的问题:

函数不会总是生成唯一的字符串,这是不可能的。然而,良好的功能使其极不可能比中彩票的次数少,因此在实践中足够独特

长度:

mt_rand10,99:生成一个数字 范围为[10,99]2位 intvalmicrotimetrue*100将获得 当前unix时间戳加上2 毫秒的位数。时间戳目前为10位,并将持续大约一个世纪,因此总数字为12位十进制数字 然后,它将该数字视为基数8,这将经常失败,因为基数8不知道数字8或9。我不知道在这种情况下PHP的确切行为,但它是无效的。如果将数字视为基数10,则会出现以下场景问题:如果mt_rand生成10,那么基数36需要多少位数来表示10^13和10^14之间的数字(如果mt_rand生成99)

base_36需要9位数字的最小数字是282110907457,该数字低于您的数字底边。但是,它可以用9位数字表示的最大数字是101559956668416~10^14。因此,它将生成一个9位数的基数

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


它比你自己设计的任何功能都要好。[/edit]

你的问题的答案取决于你的需求。我使用这个函数来满足一般的不太安全的需求。仅返回字母和数字,清除外观相似的字符:-

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;
}

祝你好运

您问题的答案取决于您的要求。我使用这个函数来满足一般的不太安全的需求。仅返回字母和数字,清除外观相似的字符:-

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;
}

祝你好运

简单使用uniqid良好的内置功能。这也会根据时间戳生成唯一的id。所以没有。永远是独一无二的。

简单使用uniqid良好的内置功能。这也会根据时间戳生成唯一的id。所以不会。永远是唯一的。

@KingCrunch我想要一个特定的长度,即最多6个字符。简短的回答?不,微时间会随着纪元而溢出。回答得更长?您想要最多6个字符吗?那么就没有了。您最多有36^6个唯一字符串。顺便问一下,你为什么要从基数8转换过来?为什么以36为基数?@sunjie:substruniqid,0,6;?也许你应该再解释一下,你想用这个字符串做什么。一个更标准的方法是简单地散列当前时间和/或一些其他特定于请求的数据,并从base-64编码的散列中提取6个字符。但是6个字符很短。是
是否有一个特定的要求将您限制为6人?唯一字符串的用途是什么?您需要它具有多大的唯一性,即在什么时间范围和数据量内,以及您将如何处理冲突?@KingCrunch我需要一个特定的长度,即最多6个字符。简短回答?不,微时间会随着纪元而溢出。回答得更长?您想要最多6个字符吗?那么就没有了。您最多有36^6个唯一字符串。顺便问一下,你为什么要从基数8转换过来?为什么以36为基数?@sunjie:substruniqid,0,6;?也许你应该再解释一下,你想用这个字符串做什么。一个更标准的方法是简单地散列当前时间和/或一些其他特定于请求的数据,并从base-64编码的散列中提取6个字符。但是6个字符很短。是否有特定要求将您限制为6人?唯一字符串的用途是什么?您需要它具有多大的唯一性,即在什么时间范围和数据量内,以及您将如何处理冲突?感谢您的详细回复。应该是从10号基地发射的,不是8号基地。我想生成一个最多6个字母数字字符的字符串,该字符串具有最大的唯一性。你能提出任何解决方案吗?这是一个非常糟糕的使用uniqid的建议。基本上,uniqid将微时间转换为较小的字符串简单的基转换。例如,它的前5个字符在一个小时内不会改变,因此substruniqid,0,6将在很长一段时间内生成相同的字符串,它肯定不是唯一的。其次,即使使用完整的uniqid字符串,也会使您容易受到一些攻击,因为它的值是非常可预测的:。但是如果你不关心安全性,你可以使用substruniqid,-6。谢谢你的详细回复。应该是从10号基地发射的,不是8号基地。我想生成一个最多6个字母数字字符的字符串,该字符串具有最大的唯一性。你能提出任何解决方案吗?这是一个非常糟糕的使用uniqid的建议。基本上,uniqid将微时间转换为较小的字符串简单的基转换。例如,它的前5个字符在一个小时内不会改变,因此substruniqid,0,6将在很长一段时间内生成相同的字符串,它肯定不是唯一的。其次,即使使用完整的uniqid字符串,也会使您容易受到一些攻击,因为它的值是非常可预测的:。但是如果您不关心安全性,那么可以使用substruniqid,-6。